我有以下数据。

   WM_Week  POS_Store_Count POS_Qty POS_Sales   POS_Cost
   ------   --------------- ------  --------    --------
   201541   3965            77722   153904.67   102593.04
   201542   3952            77866   154219.66   102783.12
   201543   3951            70690   139967.06   94724.60
   201544   3958            70773   140131.41   95543.55
   201545   3958            76623   151739.31   103441.05
   201546   3956            73236   145016.54   98868.60
   201547   3939            64317   127368.62   86827.95
   201548   3927            60762   120309.32   82028.70

我需要编写一个SQL查询来获取最后四个星期的数据,并对以下各列的最后四个星期进行汇总:POS_Store_CountPOS_QtyPOS_SalesPOS_Cost

例如,如果我想要201548的数据,它将包含201548、201547、201546和201545。

201547之和将包含201547、201546、201545和201544。

成功运行后,查询应返回4行。

我将如何制定一个递归查询来做到这一点?有什么比递归更容易做到的吗?

编辑:版本为Azure Sql DW,版本号为12.0.2000。
Edit2:应该返回的四行将具有其自身的列总和,并且这是前三个星期。

例如,如果我想要201548的数字,它将返回以下内容:
WM_Week POS_Store_Count POS_Qty  POS_Sales   POS_Cost
------  --------------- -------  --------    --------
201548  15780           274938   544433.79   371166.3

这是201548201547201546201545中的四个(非身份)列的总和。

最佳答案

可以肯定的是,这将为您提供所需的内容。我在订购数据以应用SUMS之后使用交叉应用

Create  Table #WeeklyData (WM_Week Int, POS_Store_Count Int, POS_Qty Int, POS_Sales Money, POS_Cost Money)

Insert #WeeklyData Values
(201541,3965,77722,153904.67,102593.04),
(201542,3952,77866,154219.66,102783.12),
(201543,3951,70690,139967.06,94724.6),
(201544,3958,70773,140131.41,95543.55),
(201545,3958,76623,151739.31,103441.05),
(201546,3956,73236,145016.54,98868.6),
(201547,3939,64317,127368.62,86827.95),
(201548,3927,60762,120309.32,82028.7)

DECLARE @StartWeek INT = 201548;
WITH cte AS
(
    SELECT *,
            ROW_NUMBER() OVER (ORDER BY [WM_Week] DESC) rn
    FROM #WeeklyData
    WHERE WM_Week BETWEEN @StartWeek - 9 AND @StartWeek
)
SELECT *
FROM cte c1
CROSS APPLY (SELECT SUM(POS_Store_Count) POS_Store_Count_SUM,
                    SUM(POS_Qty) POS_Qty_SUM,
                    SUM(POS_Sales) POS_Sales_SUM,
                    SUM(POS_Cost) POS_Cost_SUM
             FROM   cte c2
             WHERE  c2.rn BETWEEN c1.rn AND (c1.rn + 3)
) ca
WHERE c1.rn <= 4

10-06 06:17