2个where条件来自于1列的SQL

10 浏览
0 Comments

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
0
0 Comments

问题的出现原因是需要根据某个列的两个条件进行筛选,但是只能在一个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。

0