【问题标题】:SQL Week over Week query for given timeframe给定时间范围内的 SQL Week over Week 查询
【发布时间】:2018-04-04 23:20:42
【问题描述】:

我有一张用于支持票证的表格。我正在尝试创建一个查询,显示过去 8 周的每周细分(创建了多少票)。

我已经创建了一个日历表,我正在尝试利用它来创建查询。

例子:

SELECT *
FROM dbo.Calendar
WHERE calendar_DT >= DATEADD(week, -8, GETUTCDATE() -1)
AND calendar_DT <= GETUTCDATE()
ORDER BY calendar_DT ASC

这里我有一个基本查询,它提供了过去 8 周内的所有日期。从这里开始,我尝试按周对这些数据进行分组,这样我就有了weekStartweekEnd,然后创建了一个我将加入另一个表的记录计数。

我尝试在没有日历表的情况下执行此操作,但似乎如果某个特定周的记录不存在,那么结果中就会出现空白,而不是 0

这是我最初的尝试。它接近我想要的最终结果。但是,我不确定 null 来自哪里,并且它缺少 2 周的数据,在此期间没有创建任何请求。

SELECT  DATEADD(week, DATEDIFF(week, 0, createdDate), 0) [From],
        DATEADD(week, DATEDIFF(week, 0, createdDate), 0) + 6 [To],
        COUNT(DISTINCT reqID) newRequests
FROM dbo.support_tickets
WHERE createdDate >= DATEADD(week, -8, GETUTCDATE())
AND tool = 244
GROUP BY DATEDIFF(week, 0, createdDate) WITH ROLLUP
ORDER BY DATEDIFF(week, 0, createdDate)

所需的结果如上图所示,是过去 8 周中每一周创建的记录总数。

我是否需要继续使用日历表,或者是否可以在没有它的情况下完成并仍然显示to/from,即使那周没有结果?

【问题讨论】:

  • 日历表的重点是查询的基础。如果您排除它,您如何建议在没有数据时从查询中返回一行?

标签: sql sql-server stored-procedures


【解决方案1】:

NULL 行是 GROUP BY...WITH ROLLUP 的结果。这就是汇总。 newRequests 值 7 是您的其他记录的总数。

如果您希望列出表格中没有的日期,则需要从其他地方获取它们,这正是日历表格的用途。因此,添加该联接后,您的状态实际上非常好。

【讨论】:

  • 感谢您的信息 - 我想这就是我需要尝试弄清楚的,加入日历表并按周分组
  • 可能至少有六种方法来管理它。一种方法可能是将您的 createdDate 加入 Calendar_DT,按 week_ending_date 分组,然后只计算周开始日期。由于没有表模式,我不确定这是否可行,但类似这样。
猜你喜欢
  • 1970-01-01
  • 2014-12-25
  • 2018-12-08
  • 1970-01-01
  • 2012-11-18
  • 1970-01-01
  • 2011-02-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多