2个where条件来自于1列的SQL
2个where条件来自于1列的SQL
我尝试使用WHERE
子句从一个列中查看两个条件列。
例如:
我有一个数据集,其中有一个很长的电话列表。我想要看到两个不同的列,第一列显示所有通话时间大于等于0秒的通话数量,第二列显示所有通话时间大于等于120秒的通话数量。
这是我的第一个查询:
SELECT distinct year(date) Year, monthname(date) as Month, count(calls) Leads FROM database.calls where duration >= 120 and year(date) = 2022 group by month(date) order by max(date);
第二个查询:
(唯一的区别是第三行中的duration等于0)
SELECT distinct year(date) Year, monthname(date) as Month, count(calls) Leads FROM database.calls where duration >= 0 and year(date) = 2022 group by month(date) order by max(date);
期望结果:
年份 | 月份 | 通话(0秒) | 通话(120秒) |
---|---|---|---|
2022 | 一月 | 654 | 521 |
2022 | 二月 | 895 | 465 |
2022 | 三月 | 562 | 321 |
问题的出现原因是需要根据某个列的两个条件进行筛选,但是只能在一个WHERE子句中指定一个条件。解决方法是使用条件聚合,即在聚合函数中指定条件,以便只对符合条件的值进行聚合。
具体解决方法如下所示:
SELECT YEAR(date) AS Year_, MONTHNAME(date) AS Month_, SUM(IF(duration > 0, 1, 0)) AS Calls0Sec, SUM(IF(duration > 120, 1, 0)) AS Calls120Sec FROM database.calls WHERE YEAR(date) = 2022 GROUP BY YEAR(date), MONTHNAME(date) ORDER BY MAX(date);
需要注意的是,在GROUP BY子句中需要添加被选择的每个字段和非聚合字段,否则可能会导致数据库管理系统错误或错误的数据输出。
第3行和第4行的逻辑是使用IF条件语句进行判断。IF语句的结构是`IF (条件, 如果条件为真则返回的值, 如果条件为假则返回的值)`。第一个字段是条件,可以是任何返回布尔值的函数。如果条件为真,则返回第二个字段,否则返回第三个字段。在这个例子中,如果`duration`大于0,则在第3行返回1,否则返回0;如果`duration`大于120,则在第4行返回1,否则返回0。