Jak już wspomniano, MySQL nie jest zbudowany do samodzielnego przestawiania i prawdopodobnie powinieneś przestawiać w kodzie, jeśli to możliwe, ale poza tym, poniżej znajduje się przykład SQL, który powinien robić to, co chcesz. Zakładając, że twoja rzeczywista tabela jest w pewnym sensie zmienna (np. ile masz kolumn q[x] lub ile masz super_id), możesz to zapakować w procedurę składowaną, aby dynamicznie generować i wykonywać niezbędny kod SQL.
Zakładając początkową tabelę o nazwie testTable:
mysql> select * from testTable;
+----------+--------+------+------+
| super_id | cat_id | qa | qb |
+----------+--------+------+------+
| 1 | 1 | 5 | 5 |
| 1 | 2 | 2 | 5 |
| 1 | 3 | 3 | 4 |
| 2 | 4 | 5 | 3 |
| 2 | 5 | 3 | 4 |
| 2 | 6 | 4 | 2 |
+----------+--------+------+------+
6 rows in set (0.00 sec)
Użyj następującego SQL:
SELECT
'qa' q,
SUM( CASE WHEN super_id = 1 THEN qa ELSE 0 END )/SUM( CASE WHEN super_id = 1 THEN 1 ELSE 0 END ) super_id_1,
SUM( CASE WHEN super_id = 2 THEN qa ELSE 0 END )/SUM( CASE WHEN super_id = 2 THEN 1 ELSE 0 END ) super_id_2
FROM
testTable
UNION ALL
SELECT
'qb' q,
SUM( CASE WHEN super_id = 1 THEN qb ELSE 0 END )/SUM( CASE WHEN super_id = 1 THEN 1 ELSE 0 END ) super_id_1,
SUM( CASE WHEN super_id = 2 THEN qb ELSE 0 END )/SUM( CASE WHEN super_id = 2 THEN 1 ELSE 0 END ) super_id_2
FROM
testTable
;
Aby osiągnąć ten wynik:
+----+------------+------------+
| q | super_id_1 | super_id_2 |
+----+------------+------------+
| qa | 3.3333 | 4.0000 |
| qb | 4.6667 | 3.0000 |
+----+------------+------------+
2 rows in set (0.00 sec)
(edycja:formatowanie)