SQL - 按周分组的两个日期之间获取数据

时间:2018-05-08 14:15:03

标签: sql tsql sql-server-2012

这个问题可能已经解决了很多次甚至多次问过。但由于我不熟悉SQL,我无法弄清楚在互联网上找到的东西。就像我无法根据我的需要调整来自Internet的查询。 这就是我的需要

我有一个名为 Orders 的表格,其中包含OrderIdOrderDate等字段。

我需要生成Excel工作表。工作表将包含按周分组的订单数。 (就像那周内下订单数量一样)

用户可以选择他/她需要报告​​的年份。

因此,如果用户选择当前年份,那么我需要生成包含从1月1日到今天按星期分组的数据的Excel报告。

如果用户选择任何其他年份(可能是前几年),那么我需要生成一份报告,其中包含按周分组的该年度的所有数据。

目前,我正在寻找一个返回这样的数据的SQL查询(预期输出)

Week    Date Range               Total No of Orders
-----+--------------------------+-------------------
week#1  2018-01-01 - 2018-01-07     10 
week#2  2018-01-08 - 2018-01-14     0
week#3  2018-01-15 - 2018-01-21     1

如何编写查询以实现相同的目标?

寻找专家意见......

1 个答案:

答案 0 :(得分:1)

您需要按周编号使用 CTE递归写日历,然后在CTE日历表上Orders LEFT JOIN获取COUNT

注意:

  • 变量@Dt模拟您想要开始的那一年。

查询看起来像这样。

DECLARE @Dt date = '2018-01-01' 

;WITH CTE(Dt,maxD) AS (
  SELECT DATEPART(ww,@Dt) Dt, DATEPART(ww,MAX(OrderDate)) maxD
  FROM Orders
  UNION ALL 
  SELECT (Dt +1) Dt,maxD
  FROM CTE
  WHERE (Dt +1) <= maxD
)
SELECT CONCAT('week#',c.Dt) 'week',
       CONCAT(
         CONVERT(char(10),dateadd(week,c.Dt-1, DATEADD(wk, DATEDIFF(wk,-1,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)), 0)),126)
         ,'-'
         , CONVERT(char(10),dateadd(week,c.Dt, DATEADD(wk, DATEDIFF(wk,-1,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)), 0)),126)) 'Date Range',
       COUNT(o.OrderDate) 'Total No of Orders'
FROM CTE c 
LEFT JOIN Orders o on c.Dt = DATEPART(ww,o.OrderDate)
GROUP BY c.Dt

sqlfiddle:http://sqlfiddle.com/#!18/8f089/40