You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于单列通过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);

代码说明:

  1. 条件聚合逻辑:CASE WHEN会逐行判断时长条件,符合条件时返回calls字段值,否则返回NULL;COUNT函数自动忽略NULL值,以此实现按条件统计有效通话数。
  2. 分组优化:原查询中的DISTINCT属于冗余写法,GROUP BY已经按月份分组,每组的年份和月份名称唯一,补充YEAR(date)和MONTH(date)分组可避免不同年份同名月份的干扰。
  3. 排序优化:用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 03:25:16