MySQL数据透视表头Scratcher

时间:2012-02-02 18:06:12

标签: mysql

我因为转动桌子而感到难过,沮丧程度正在上升。我意识到答案可能在我面前,但我找不到它。我已经尝试了case语句,group_concat,子查询都无济于事。

如何获取当前表格...

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

看起来像这样......

       1     2 <--- super_id
qa    3.33  4.00 <--- avg
qb    4.67  3.00

谢谢!

1 个答案:

答案 0 :(得分:0)

正如已经提到的,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)

(编辑:格式化)