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



这个问题可能已经解决了很多次,甚至被问了很多次。但是由于我不精通SQL,因此我无法弄清楚在互联网上找到的东西。就像我无法根据我的需求调整来自互联网的查询一样。 我的需求来了

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

我需要生成一个 Excel 工作表。工作表将具有按周分组的订单计数。 (比如那一周下了多少个订单(

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

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

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

目前,我正在寻找一个返回如下数据的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

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

寻求专家建议...

您需要使用CTE递归按周数写入日历,然后在CTE日历表上OrdersLEFT 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

最新更新