這可以通過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]
您可以通過id + 1加入表格(如果您有自動增量值)。並且比添加這個語句的選擇...分行t.amt/t2.amt –
但那只是選擇... –
'我試過了,它的工作: 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