单表日期列统计:今日与月累计数据分栏查询求助
解决各地点当日记录数与当月累计记录数统计问题
看起来你在统计销售数据时遇到了当月累计数始终为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
相关产品推荐
相关产品推荐

