这个问题可能已经解决了很多次甚至多次问过。但由于我不熟悉SQL,我无法弄清楚在互联网上找到的东西。就像我无法根据我的需要调整来自Internet的查询。 这就是我的需要
我有一个名为 Orders
的表格,其中包含OrderId
,OrderDate
等字段。
我需要生成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
如何编写查询以实现相同的目标?
寻找专家意见......
答案 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