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

单表日期列统计:今日与月累计数据分栏查询求助

解决各地点当日记录数与当月累计记录数统计问题

看起来你在统计销售数据时遇到了当月累计数始终为0的问题,这是因为你原SQL里的关联逻辑搞错了——你用SALEID关联同一条记录,再给关联表加日期范围限制,这根本没法统计到当月的所有记录。咱们来直接修正这个问题,给你两种靠谱的写法:

方法一:用CASE表达式聚合统计(推荐,高效简洁)

这种写法只需要扫描一次表,逻辑清晰,效率更高:

SELECT 
    SITENAME AS Locations,
    -- 统计当日记录数(如果你的"当日"实际是昨天,把GETDATE()改成DATEADD(dd, -1, GETDATE())即可)
    SUM(CASE WHEN CAST(SALEDATE AS DATE) = CAST(GETDATE() AS DATE) THEN 1 ELSE 0 END) AS [Today's Count],
    -- 统计当月累计记录数
    SUM(CASE WHEN DATEPART(YEAR, SALEDATE) = DATEPART(YEAR, GETDATE()) 
             AND DATEPART(MONTH, SALEDATE) = DATEPART(MONTH, GETDATE()) THEN 1 ELSE 0 END) AS [Mth to Date]
FROM SALESDATA
GROUP BY SITENAME

逻辑说明:

  • CAST(SALEDATE AS DATE)把带时间的日期转成纯日期格式,和当前日期(或你需要的指定日期)对比,符合条件的记录记为1,否则0,求和后就是当日的记录总数。
  • 当月累计的判断逻辑是匹配当前年份和月份,同样用SUM(CASE...)统计所有符合条件的记录数。

方法二:用子查询关联统计(适合需要拆分逻辑的场景)

如果你更习惯用子查询的方式,也可以拆分当日和当月的统计结果,再和所有地点关联:

SELECT 
    l.SITENAME AS Locations,
    ISNULL(t.TodayCount, 0) AS [Today's Count],
    ISNULL(m.MonthCount, 0) AS [Mth to Date]
-- 先获取所有存在的地点
FROM (SELECT DISTINCT SITENAME FROM SALESDATA) l
-- 关联当日统计结果
LEFT JOIN (
    SELECT SITENAME, COUNT(SALEID) AS TodayCount
    FROM SALESDATA
    WHERE CAST(SALEDATE AS DATE) = CAST(GETDATE() AS DATE)
    GROUP BY SITENAME
) t ON l.SITENAME = t.SITENAME
-- 关联当月统计结果
LEFT JOIN (
    SELECT SITENAME, COUNT(SALEID) AS MonthCount
    FROM SALESDATA
    WHERE DATEPART(YEAR, SALEDATE) = DATEPART(YEAR, GETDATE()) 
      AND DATEPART(MONTH, SALEDATE) = DATEPART(MONTH, GETDATE())
    GROUP BY SITENAME
) m ON l.SITENAME = m.SITENAME

原SQL的问题分析:

你之前的JOIN条件M.SALEID = A.SALEID是关联同一条销售记录,然后又给M的日期范围设为当月第一天到昨天,而WHERE条件又筛选了A的日期是当日(或昨天),这就导致只有当同一条记录同时满足两个矛盾的日期范围才会被统计,所以COUNT(M.SALEID)自然是0,逻辑完全错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 08:18:10