すでに述べたように、MySQLはそれ自体でピボットするように構築されていないため、可能であればコードでピボットする必要がありますが、それを除けば、以下は必要なことを実行するSQLの例です。実際のテーブルが何らかの意味で可変であると仮定すると(たとえば、q [x]列の数や、super_idの数など)、これをストアドプロシージャにまとめて、必要なSQLを動的に生成して実行できます。
>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)
次の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
;
この結果を達成するには:
+----+------------+------------+
| q | super_id_1 | super_id_2 |
+----+------------+------------+
| qa | 3.3333 | 4.0000 |
| qb | 4.6667 | 3.0000 |
+----+------------+------------+
2 rows in set (0.00 sec)
(編集:フォーマット)