是否可以构造一个查询来根据多个条件创建多个列并按时间聚合。例如一个简单的表格,如下所示:
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-30
、30-40
、40-50
并手动连接输出,但我' d 就像单个查询将它们组合到一个表中,因此输出将是:
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
最佳答案
您可以使用 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),此处(以及原始代码中)存在问题。
灵 active 方面,您可能最好使用另一个存储范围的表,加入该表以获得每周/每年每个范围的一行,然后将行转换为脚本中的列。添加范围时无需修改代码。
关于mysql - 每个 where 子句创建列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22044634/