基于单列通过WHERE子句生成双条件统计列的SQL需求
合并统计的SQL方案
你可以使用条件聚合函数实现单查询生成两个统计列,无需分开两次查询。核心是在SELECT子句中通过CASE WHEN判断通话时长条件,结合聚合函数完成分组统计:
SELECT YEAR(date) AS Year, MONTHNAME(date) AS Month, COUNT(CASE WHEN duration >= 0 THEN calls END) AS `Calls(0sec)`, COUNT(CASE WHEN duration >= 120 THEN calls END) AS `Calls(120sec)` FROM database.calls WHERE YEAR(date) = 2022 GROUP BY YEAR(date), MONTH(date), MONTHNAME(date) ORDER BY MIN(date);
代码说明:
- 条件聚合逻辑:
CASE WHEN会逐行判断时长条件,符合条件时返回calls字段值,否则返回NULL;COUNT函数自动忽略NULL值,以此实现按条件统计有效通话数。 - 分组优化:原查询中的
DISTINCT属于冗余写法,GROUP BY已经按月份分组,每组的年份和月份名称唯一,补充YEAR(date)和MONTH(date)分组可避免不同年份同名月份的干扰。 - 排序优化:用
MIN(date)排序更贴合月份的自然顺序,逻辑更直观且结果一致。
如果你的SQL方言支持SUM(IF(...))简化写法(如MySQL),也可以用以下等效代码:
SELECT YEAR(date) AS Year, MONTHNAME(date) AS Month, SUM(IF(duration >= 0, 1, 0)) AS `Calls(0sec)`, SUM(IF(duration >= 120, 1, 0)) AS `Calls(120sec)` FROM database.calls WHERE YEAR(date) = 2022 GROUP BY YEAR(date), MONTH(date), MONTHNAME(date) ORDER BY MIN(date);
两种写法都能直接生成你需要的合并结果表格,且仅扫描一次数据集,比两次独立查询更高效。
内容的提问来源于stack exchange,提问作者Leonardo Urbiola
相关产品推荐
相关产品推荐

