簡體   English   中英

使用LAG功能運行總計

[英]Running Total Using LAG Function

我想知道是否有人可以幫我計算一個總計。

我正在從現有的excel解決方案轉換它,所以我知道我的目標。

我正在嘗試使用LAG從前一行獲取值,但計算與我的目標不匹配。 我想我需要使用滯后列中前一行的結果,但這看起來不太可能。

任何幫助贊賞。

use tempdb;

--Create Temp Table 
IF OBJECT_ID('tempdb..#WareHouseData') IS NOT NULL DROP TABLE #WareHouseData
CREATE TABLE #WareHouseData
   ( 
      ItemId    INT,
      DateID    INT,
      OpenningWareHouseUnits INT,
      FcastSales INT,
      GoodsIncoming INT,
      TargetRunningStock INT
   ); 

--Fill It With example Data
--OpenningWareHouseUnits only exists in the first week 
--Fcast sales can be in any week though normally all weeks
--Goods Incoming can be in any weeks
INSERT INTO #WareHouseData  
    ([ItemId],[DateID],[OpenningWareHouseUnits],[FcastSales],[GoodsIncoming],[TargetRunningStock])
VALUES  
(987654,201450,200,10,NULL,190),
(987654,201451,NULL,20,NULL,170),
(987654,201452,NULL,30,NULL,140),
(987654,201501,NULL,20,NULL,120),
(987654,201502,NULL,10,NULL,110),
(987654,201503,NULL,50,NULL,60),
(987654,201504,NULL,60,NULL,0),
(987654,201505,NULL,70,100,30),
(987654,201506,NULL,70,80,40),
(987654,201507,NULL,80,100,60),
(987654,201508,NULL,30,NULL,30),
(987654,201509,NULL,20,NULL,10),
(987654,201510,NULL,20,NULL,0),
(123456,201450,300,50,NULL,250),
(123456,201451,NULL,60,NULL,190),
(123456,201452,NULL,70,100,220),
(123456,201501,NULL,80,NULL,140),
(123456,201502,NULL,100,100,140),
(123456,201503,NULL,105,NULL,35),
(123456,201504,NULL,100,100,35),
(123456,201505,NULL,95,NULL,0),
(123456,201506,NULL,30,100,70),
(123456,201507,NULL,20,NULL,50),
(123456,201508,NULL,5,NULL,45),
(123456,201509,NULL,5,NULL,40),
(123456,201510,NULL,5,NULL,35),
(369258,201450,1000,100,NULL,900),
(369258,201451,NULL,100,NULL,800),
(369258,201452,NULL,100,NULL,700),
(369258,201501,NULL,100,NULL,600),
(369258,201502,NULL,100,NULL,500),
(369258,201503,NULL,100,NULL,400),
(369258,201504,NULL,100,NULL,300),
(369258,201505,NULL,100,NULL,200),
(369258,201506,NULL,100,NULL,100),
(369258,201507,NULL,100,500,500),
(369258,201508,NULL,100,NULL,400),
(369258,201509,NULL,100,NULL,300),
(369258,201510,NULL,100,NULL,200);
;


--Match The Target Runing Stock Total
--I need to match the TargetRunningStock Totals
--This can be recreated in excel by pasting the columns 
--{ItemId   DateID  OpenningWareHouseUnits  FcastSales  GoodsIncoming}
--Into cell A1 with headers, and pasting this formula 
-- =IF(C2="",IF((F1-D2+E2)<0,0,(F1-D2+E2)),(C2-D2+E2)) into cell F2  
SELECT w.ItemId
    ,   w.DateID    
    ,   w.OpenningWareHouseUnits    
    ,   w.FcastSales    
    ,   w.GoodsIncoming 
    ,   w.TargetRunningStock
    ,   CASE WHEN w.OpenningWareHouseUnits IS NOT NULL
             THEN (ISNULL(w.OpenningWareHouseUnits,0) - ISNULL(w.FcastSales,0) + ISNULL(w.GoodsIncoming,0))
             ELSE  CASE WHEN ((((LAG(ISNULL(w.OpenningWareHouseUnits,0),1)  OVER (PARTITION BY w.ItemId  ORDER BY w.ItemId,w.DateID))- 
                                    (LAG(ISNULL(w.FcastSales,0),1)  OVER (PARTITION BY w.ItemId  ORDER BY w.ItemId,w.DateID)) + 
                                        (LAG(ISNULL(w.GoodsIncoming,0),1)  OVER (PARTITION BY w.ItemId  ORDER BY w.ItemId,w.DateID)))) -
                                ISNULL(w.FcastSales,0) + ISNULL(w.GoodsIncoming,0)) < 0
                        THEN 0
                        ELSE ((((LAG(ISNULL(w.OpenningWareHouseUnits,0),1)  OVER (PARTITION BY w.ItemId  ORDER BY w.ItemId,w.DateID))- 
                                    (LAG(ISNULL(w.FcastSales,0),1)  OVER (PARTITION BY w.ItemId  ORDER BY w.ItemId,w.DateID)) + 
                                        (LAG(ISNULL(w.GoodsIncoming,0),1)  OVER (PARTITION BY w.ItemId  ORDER BY w.ItemId,w.DateID)))) -
                                ISNULL(w.FcastSales,0) + ISNULL(w.GoodsIncoming,0))
                     END
            END  CalculatedRunningStock
FROM #WareHouseData w
ORDER BY w.ItemId
    ,   w.DateID    

為了簡單(和時間)而忽略大部分計算邏輯,你幾乎肯定需要sum() over (partition by ... order by...)

select ItemId, DateId, TargetRunningStock, 
       sum(TargetRunningStock) over (partition by itemid order by dateid)
from WarehouseData
order by ItemId, DateId;
ItemId  DateId  TargetRunningStock  Sum
--
123456  201450  250                 250
123456  201451  190                 440
123456  201452  220                 660
...
987654  201507  60                  920
987654  201508  30                  950
987654  201509  10                  960
987654  201510   0                  960

由於您嘗試從電子表格中重現結果,因此您可能需要在使用lag()的某些計算列周圍包裝這樣的內容。 我沒有深入研究您的電子表格邏輯。

運行總和的基本語法是在sum()窗口函數的partition子句中使用order by

SELECT w.ItemId, w.DateID, w.OpenningWareHouseUnits, w.FcastSales,
       w.GoodsIncoming, w.TargetRunningStock,
       SUM(OpenningWareHouseUnits) OVER (PARTITION BY w.ItemId, w.DateId)
FROM #WareHouseData w
ORDER BY w.ItemId, w.DateID ;

我有點不清楚如何將其應用於您的配方。 樣本數據和期望的結果將是一個很大的幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM