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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 12:27:38