2015-07-11 54 views
3

我已經此表中,現在,我需要對AMT列進行分割和更新數據INT CalcAmt在sql中按行劃分row1,按row2劃分row2 .... 。而存儲輸出第三列

month amt CalcAmt 
JAN 10000 NULL 
FEB 20000 NULL 
MAR 30000 NULL 
APR 40000 NULL 

例如:(FEB/JAN),然後在二月的CalcAmt存儲輸出, (MAR/FEB)則在MAR的CalcAmt商店輸出,

預期輸出:

month amt CalcAmt 
JAN 10000 0 
FEB 20000 2 
MAR 30000 1.5 
APR 40000 1.33 
+0

您可以通過id + 1加入表格(如果您有自動增量值)。並且比添加這個語句的選擇...分行t.amt/t2.amt –

+0

但那只是選擇... –

+0

'我試過了,它的工作: set @sr =(select top 1 Sr_No from #tempo order by#tempo.Sr_No desc); WHILE(@sr> 0)BEGIN \t如果@sr> 1 \t開始 \t組@Value =(選擇[銷售(INR)]從#tempo其中Sr_No = @sr) \t組@ VALUE2 =(從@tempo選擇[Sales(INR)]其中Sr_No =(@ sr-1) \t set @ value3 =(select @ Value/@ value2) \t Update #tempo set Gropm = @ Value3 where#tempo.Sr_No = @sr \t \t set @sr = @sr - 1; \t端 \t別的 \t開始 \t更新#tempo設置Gropm = 0其中#tempo.Sr_No = 1個 \t組@sr = @sr - 1; \t end' – Steph

回答

0

這可以通過LEAD/LAG很容易做到,因爲使用Sql Server 2008你不能使用LEAD/LAG函數。相反,使用可以爲每一行生成行號,並且自行加入具有行號+ 1的同一表以獲取先前的行數據。

注意:如果您有任何問題,您需要在case聲明中添加剩餘的months

作爲一個側面說明,你不應該使用reserved keywords作爲對象名稱例如:MONTH

;WITH cte 
    AS (SELECT Rn=CASE [month] 
        WHEN 'Jan' THEN 1 
        WHEN 'feb' THEN 2 
        WHEN 'mar' THEN 3 
        ELSE 4 
        END, 
       * 
     FROM YOURTABLE) 
SELECT A.month, 
     A.amt, 
     CalcAmt = A.amt/NULLIF(b.amt ,0) 
FROM cte A 
     LEFT OUTER JOIN cte B 
        ON A.rn = b.rn + 1 

如果你想更新表,然後用這個。

;WITH cte 
    AS (SELECT Rn=CASE [month] 
        WHEN 'Jan' THEN 1 
        WHEN 'feb' THEN 2 
        WHEN 'mar' THEN 3 
        ELSE 4 
        END, 
       * 
     FROM YOURTABLE) 
UPDATE C 
SET C.calcamt = D.calcamt 
FROM cte C 
     INNER JOIN (SELECT A.month, 
          A.amt, 
          calcamt=A.amt/b.amt 
        FROM cte A 
          LEFT OUTER JOIN cte B 
             ON A.rn = b.rn + 1) D 
       ON C.[month] = D.[month]