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

過去 4 週間のデータを取得するための SQL クエリを作成する必要があり、次の各列について過去 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: 返される必要がある 4 つの行には、それ自体からの列の合計があり、それは 3 週間前です。

たとえば、201548 の数値が必要な場合は、次のように返されます。

WM_Week POS_Store_Count POS_Qty  POS_Sales   POS_Cost
------  --------------- -------  --------    --------
201548  15780           274938   544433.79   371166.3

201548201547201546、およびの 4 つの (非同一性) 列の合計です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 に答える
0

私の理解が正しければ、4 行を返すのではなく、グループごとに 4 つの合計列を返したいですか? その場合、次の 1 つのオプションがあります。

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サーバーをサポートしていないため、構文が少しずれています)。

于 2016-01-05T22:24:30.387 に答える