繁体   English   中英

计算每日总计跳过天数的 SQL 查询

[英]SQL Query to Count Daily Totals Skips Days

此查询计算我们在一个月内生产的瓶子数量并按天分组。 如果当天没有瓶子生产,那么它会从输出中跳过,而不是返回生产的 0 瓶。 如果没有生产瓶子,我如何返回当天的时间戳? 我听说必须为此使用日历表。

SELECT CONVERT(datetime,CAST(t_stamp AS DATE)), COUNT(bottles) AS 'Good Bottles'
FROM bottles
WHERE t_stamp
    BETWEEN "any date"
    AND "any date"
GROUP BY CAST(t_stamp AS DATE)
ORDER BY CAST(t_stamp AS DATE) ASC

电流输出:

Aug 12, 2019 12:00 am..................4302
Aug 13, 2019 12:00 am..................2302
Aug 17, 2019 12:00 am..................1302
Aug 18, 2019 12:00 am..................4302

期望输出:

Aug 12, 2019 12:00 am..................4302
Aug 13, 2019 12:00 am..................2302
Aug 14, 2019 12:00 am..................0
Aug 15, 2019 12:00 am..................0
Aug 16, 2019 12:00 am..................0
Aug 17, 2019 12:00 am..................1302
Aug 18, 2019 12:00 am..................4302

您需要生成天数。 一个非常简单的方法使用递归 CTE:

WITH dates as (
      SELECT CONVERT(date, "any date1") as dte
      UNION ALL
      SELECT DATEADD(day, 1, dte)
      FROM dates
      WHERE dte < "any date2"
     )
SELECT d.dte, COUNT(bottles) AS GoodBottles
FROM dates d LEFT JOIN
     bottles b
     ON CAST(t_stamp as DATE) = d.dte
GROUP BY d.dte
ORDER BY d.dte ASC;

笔记:

  • 如果您有日历或计数表,请改用它。
  • 如果日期数超过 100,则需要添加OPTION (MAXRECURSION 0)
  • COUNT(bottles)看起来很可疑。 你真的打算SUM(bottles)吗?
  • 将列转换为date然后转换为datetime时间也是可疑的。 目前尚不清楚为什么您需要第一列的datetime时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM