在MSSQL中按日期统计ScheduleSlots表启用与禁用状态数量的SQL语句实现
没问题,我来帮你搞定这个统计需求!你当前的SQL主要有两个核心问题,导致结果不符合预期:一是子查询没有和外层的日期关联,所以所有行返回的都是整个时间区间的总数量;二是GROUP BY里包含了具体的Time字段和scheduleID,这会让结果按每个具体时间点和scheduleID拆分,而不是按天汇总。
下面是两种能满足你需求的正确SQL方案:
方案一:用SUM(CASE...)实现条件统计(最直观)
这种方式通过条件判断来分别统计每天的启用和禁用数量,逻辑清晰易懂:
SELECT CAST(Time AS DATE) AS 日期, SUM(CASE WHEN Enabled = 1 THEN 1 ELSE 0 END) AS 启用数量, SUM(CASE WHEN Enabled = 0 THEN 1 ELSE 0 END) AS 禁用数量 FROM [dbo].[ScheduleSlots] WHERE CAST(Time AS DATE) BETWEEN '2021-03-31' AND '2021-04-01' AND CalendarGroupID = 1 AND Level = 1 GROUP BY CAST(Time AS DATE) ORDER BY 日期
方案二:使用PIVOT语法转换行列为列
如果你熟悉SQL的PIVOT功能,也可以用这种方式实现分组统计,效果和上面一致:
SELECT 日期, [1] AS 启用数量, [0] AS 禁用数量 FROM ( SELECT CAST(Time AS DATE) AS 日期, Enabled FROM [dbo].[ScheduleSlots] WHERE CAST(Time AS DATE) BETWEEN '2021-03-31' AND '2021-04-01' AND CalendarGroupID = 1 AND Level = 1 ) AS SourceTable PIVOT ( COUNT(Enabled) FOR Enabled IN ([1], [0]) ) AS PivotTable ORDER BY 日期
关键说明
- 两种方案都是先把
Time字段转换为DATE类型,确保按天来分组,而不是具体的时间点。 - 过滤条件(日期范围、CalendarGroupID、Level)只需要写一次,不需要重复在子查询里写,避免冗余。
- 最后加上
ORDER BY 日期可以让结果按时间顺序排列,更符合展示需求。
这样查询出来的结果就会完全匹配你想要的格式:每天一行,分别展示该天的启用和禁用数量。
内容的提问来源于stack exchange,提问作者xasx
相关产品推荐
相关产品推荐

