如何在SQL Server中用单查询获取昨日、近7日、上月数据?
在SQL Server中一次性统计昨日、近7日、上月数据的查询方案
我来帮你搞定这个统计需求!在SQL Server里,咱们可以用条件聚合的方式,通过单个查询就能同时算出这三个时间段的记录数,完美匹配你想要的结果格式。
核心思路是:按Field1分组,对每个分组分别用CASE WHEN判断记录是否属于目标时间段,再用COUNT统计符合条件的记录数量。下面是具体的实现代码,我会给你标注清楚每个部分的逻辑:
SELECT Field1, -- 统计昨日的记录数:判断startdate是否落在昨日的自然日内 COUNT(CASE WHEN CAST(startdate AS DATE) = DATEADD(DAY, -1, CAST(GETDATE() AS DATE)) THEN 1 END) AS Yesterday, -- 统计近7日的记录数:过去7天(包含今日);若要排除今日,把条件改成startdate >= DATEADD(DAY, -7, GETDATE()) AND startdate < CAST(GETDATE() AS DATE) COUNT(CASE WHEN startdate >= DATEADD(DAY, -7, GETDATE()) THEN 1 END) AS Last7Days, -- 统计上月的记录数:精准匹配上月的完整自然月范围 COUNT(CASE WHEN startdate >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - 1, 0) AND startdate < DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0) THEN 1 END) AS LastMonth FROM YourTable -- 替换成你的实际表名 -- 可选:过滤掉startdate为空的无效记录 WHERE startdate IS NOT NULL GROUP BY Field1 ORDER BY Field1;
额外说明(根据你的实际场景调整)
如果你的需求是统计记录的有效时间段(startdate到enddate)与目标时间段有重叠的记录(而不是仅startdate在目标时间段内),可以修改CASE WHEN里的条件:
- 昨日重叠的判断示例:
CASE WHEN startdate < CAST(GETDATE() AS DATE) AND enddate >= DATEADD(DAY, -1, CAST(GETDATE() AS DATE)) THEN 1 END - 上月重叠的判断示例:
CASE WHEN startdate < DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0) AND enddate >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - 1, 0) THEN 1 END
这样就能灵活适配不同的业务统计规则啦!
内容的提问来源于stack exchange,提问作者Naveen Bodapati




