如何更改查询中的行的列数

时间:2017-09-11 18:24:54

标签: mysql sql

我的网页上有一个有很多目标的调查,从1到5进行评估。我将调查发送到我的调查表中的数据库中。 例如

 obj1value | obj2value | obj3value ...  | obj17value |

我对每次调查都有价值。

现在我需要做一些图表来呈现调查报告。 我需要为每个目标加总。 我有这个查询

SELECT SUM(obj1_value) AS objective1, SUM(obj2_value) AS objective2, SUM(obj3_value) AS objective3, FROM tbl_survey

我有这个直到objective17并且查询返回

| objective1 | objective2 | objective3 | 
|   ---      |    ---     |    ---     |
|    17      |     12     |    5       |

但我需要像这样更改查询

_objective_ | _Value_           
objective1  | 17 
objective2  | 12 
objective3  | 5  
Objective17 |  n

有人可以帮我查询优化,因为通过这种方式我可以在json中转换表php并使条形图库变得如此简单。
谢谢

2 个答案:

答案 0 :(得分:0)

这个问题的解决方案是PIVOT AN UNPOVIT,你可以改变你想要的输出,this is tutorial can help you

答案 1 :(得分:0)

在PHP中进行转换可能最简单。 MySQL中的一种方法是简单的UNION ALL

SELECT 'obj1_value', SUM(obj1_value) 
FROM tbl_survey
UNION ALL
SELECT 'obj2_value', SUM(obj2_value) 
FROM tbl_survey
UNION ALL
. . .

这种方法的缺点是表格扫描了17次,所以它可能需要17倍的时间。

您可以通过执行unpivot来提高性能。这是MySQL中的一种方法:

SELECT o.obj,
       (CASE WHEN obj = 'objective1' THEN objective1
             WHEN obj = 'objective2' THEN objective2
             . . .
        END) as value
FROM (SELECT SUM(obj1_value) AS objective1, SUM(obj2_value) AS objective2, 
             SUM(obj3_value) AS objective3, . . .
      FROM tbl_survey
     ) s CROSS JOIN
     (SELECT 'objective1' as obj UNION ALL
      SELECT 'objective2' as obj UNION ALL
      . . .
     ) o;