根据where子句创建列

时间:2014-02-26 14:38:46

标签: mysql sql

是否可以构建查询以根据多个条件创建多个列并按时间聚合。例如一个简单的表:

id value created
1  45    datetime
2  52    datetime
3  24    datetime
4  33    datetime
5  20    datetime

我可以得到一年中每周10到20之间的所有值,如下所示:

SELECT count(*) as '10-20', week(created) as 'week', year(created) as 'year'
FROM table 
WHERE value > 10 AND value < 20
GROUP BY year(created), week(created)

这将举例说明:

10-20 week year
40    1    2014
21    2    2014
3     33   2014

我可以重复范围20-3030-4040-50的查询并手动加入输出但是我想要将这些组合成表格的单个查询,因此输出会是:

10-20 20-30 30-40 40-50 week year
40    0     33    42    1    2014
21    1     0     2     1    2014
0     0     32    0     12   2014
3     42    34    32    33   2014

1 个答案:

答案 0 :(得分:1)

您可以使用SUM而不是COUNT,在和的括号内使用IF

像这样的东西

SELECT SUM(IF(value > 10 AND value < 20), 1, 0) as '10-20', 
        SUM(IF(value > 20 AND value <  30), 1, 0) as '20-30', 
        SUM(IF(value > 30 AND value <  40), 1, 0) as '30-40', 
        SUM(IF(value > 40 AND value <  50), 1, 0) as '40-50',
week(created) as 'week', year(created) as 'year'
FROM table 
WHERE 
GROUP BY year(created), week(created)

请注意,此处(以及您的原始代码中)有一个值在边框上的项目(例如,如果为20)存在问题。

灵活性方面你可能会更好地使用另一个存储范围的表,加入它以获得每周/每年范围一行,然后将行转换为脚本中的列。添加范围时保存修改代码。