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

SQL Server中如何在一行内查询不同时间范围的计数数据

解决SQL Server单行展示多时间范围计数的需求

嘿,我明白你想把不同时间范围的统计结果合并到同一行,而不是分开查多行。这在SQL里用条件聚合就能轻松搞定,不用反复查询表啦!

核心思路

我们可以用CASE WHEN语句搭配聚合函数(比如SUM或COUNT),针对每个时间范围单独统计,最终把所有结果整合到一行输出。

完整SQL语句

SELECT
    TYPE_ID,
    SUM(CASE WHEN DUE_DATE = CAST(GETDATE() AS DATE) THEN 1 ELSE 0 END) AS COUNT_TODAY,
    SUM(CASE WHEN DUE_DATE >= DATEADD(DAY, -7, CAST(GETDATE() AS DATE)) THEN 1 ELSE 0 END) AS COUNT_ONE_WEEK,
    SUM(CASE WHEN DUE_DATE >= DATEADD(MONTH, -1, CAST(GETDATE() AS DATE)) THEN 1 ELSE 0 END) AS COUNT_ONE_MONTH
FROM A
GROUP BY TYPE_ID;

关键细节说明

  1. 日期匹配的坑要避开:
    我用CAST(GETDATE() AS DATE)而非直接用GETDATE(),因为GETDATE()会返回带时分秒的当前时间。如果你的DUE_DATE只存年月日(不带时间),直接用GETDATE()会导致当天的数据匹配不到。要是DUE_DATE带时间,你可以按需调整,比如要统计当天0点到现在的数据,就改成DUE_DATE >= CAST(GETDATE() AS DATE) AND DUE_DATE < DATEADD(DAY, 1, CAST(GETDATE() AS DATE))。

  2. 条件聚合的逻辑:
    每个CASE WHEN会判断当前行的DUE_DATE是否符合时间范围,符合就返回1,否则返回0。SUM把这些1和0累加,就得到了对应时间范围的记录数。你也可以用COUNT实现,但SUM的方式更直观,还不用担心CT字段为NULL的情况(COUNT会自动忽略NULL值)。

  3. 分组的灵活调整:
    如果你需要按每个TYPE_ID分别统计,就保留GROUP BY TYPE_ID;要是想统计整个表的总数,直接去掉GROUP BY,还能把TYPE_ID换成常量(比如SELECT 'Total' AS TYPE_ID, ...)。

替代写法(用COUNT实现)

要是你习惯用COUNT,也可以这么写:

SELECT
    TYPE_ID,
    COUNT(CASE WHEN DUE_DATE = CAST(GETDATE() AS DATE) THEN CT END) AS COUNT_TODAY,
    COUNT(CASE WHEN DUE_DATE >= DATEADD(DAY, -7, CAST(GETDATE() AS DATE)) THEN CT END) AS COUNT_ONE_WEEK,
    COUNT(CASE WHEN DUE_DATE >= DATEADD(MONTH, -1, CAST(GETDATE() AS DATE)) THEN CT END) AS COUNT_ONE_MONTH
FROM A
GROUP BY TYPE_ID;

这种写法里,条件不满足时CASE返回NULL,COUNT会自动忽略这些NULL,最终得到符合条件的记录数。

内容的提问来源于stack exchange,提问作者Paras

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:56:33