mysql - 每个 where 子句创建列

标签 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 并手动连接输出,但我' 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/

相关文章:

mysql - 这两个 left join sql 查询有什么区别?

php - Zyxel NSA310 - PHP 显示源而不是执行

Python MySQLdb转义字符: query works in MySQL but not in python MySQLdb

sql group by 排序时出现的问题

php - `Editable-Changable` 删除语句中的变量

sql - Oracle:如何舍入和更新表中的所有数字?

mysql - 如何减去一最大列和一最小列?

mysql - 用于起始字符序列 mysql 5.1 的正则表达式

php - 比较时间范围并计算时间差

sql - EXEC sp_executesql 与 INSERT INTO :( 一起使用时非常慢