2

我有以下数据。

   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 查询来获取最后 4 周的数据,并将它们的最后 4 周汇总为以下列中的每一列: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

201548这是来自、201547201546和的四个(非身份)列的总和201545

4

4 回答 4

7

很确定这会让你得到你想要的。我在订购数据后使用交叉应用来应用 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 
于 2016-01-05T22:26:49.240 回答
1

您可以与OVER 子句SUM()结合使用

就像是:

SELECT WM_Week.
, SUM(POS_Store_Count) OVER (ORDER BY WM_Week ROWS BETWEEN 3 PRECEDING AND CURRENT ROW)
FROM Table
于 2016-01-05T22:27:01.607 回答
1

您应该能够为此使用 SQL 窗口函数。

在查询中添加一列,如下所示:

SUM(POS_Sales) OVER(
   ORDER BY WM_Week 
   ROWS BETWEEN 3 PRECEDING AND CURRENT ROW
) AS POS_Sales_4_Weeks
于 2016-01-05T22:27:10.003 回答
0

如果我理解正确,您不想返回 4 行,而是为每个组返回 4 个总和列?如果是这样,这是一种选择:

select max(WM_Week) as WM_Week,
       sum(POS_Store_Count),
       sum(POS_Qty),
       sum(POS_Sales),
       sum(POS_Cost)
from (select top 4 *
      from yourtable
      where wm_week <= 201548
      order by wm_week desc) t

这使用子查询来根据条件和子句 top获取要聚合的 4 行。whereorder by


这是一个演示示例的浓缩小提琴(抱歉,小提琴现在不支持 sql server,因此语法略有偏差):

于 2016-01-05T22:24:30.387 回答