2015-08-18 123 views
-1

以前行加減值我有一個值如何從基於條件

Slno Type  Amount   
1 P   40   
2 C   20   
3 P   45   
4 P   20   
5 C   10 

我想要得到結果列值的表。

Type  Amount  RESULT 
    P   40   40 
    C   20   20 
    P   45   65 
    P   20   85 
    C   10   75 

如果類型爲C,則值會從以前的值中減去, 否則,如果類型爲P值,然後被添加到以前的值。

這是我已經試過:

;WITH FINALMIDRESULT 
    AS (SELECT Type, 
       Value1, 
       Row_number() 
        OVER( 
        ORDER BY Slno ASC) rownum 
     FROM #midRes) 
SELECT C1.Type, 
     C1.Value1, 
     CASE 
     WHEN C1.Type = 'C' THEN (SELECT Sum(Amount) 
            FROM FINALMIDRESULT c2 
            WHERE c2.rownum <= C1.rownum) 
     ELSE (SELECT Sum(Amount) - Sum(Amount) 
       FROM FINALMIDRESULT c2 
       WHERE c2.rownum <= C1.rownum) 
     END AS RESULT 
FROM FINALMIDRESULT C1 

這是我有

Type  Amount  RESULT 
    P   40   0 
    C   20   60 
    P   45   0 
    P   20   0 
    C   10   135 
+1

什麼是「以前的價值」?一張桌子沒有固有的順序。那麼你想用什麼列排序?你有什麼嘗試? –

+0

;具有FINALMIDRESULT AS ( 選擇 類型,值1,ROW_NUMBER()OVER(ORDER BY Slno ASC)從#midRes ROWNUM) 選擇 C1.Type,C1.Value1,情況下,當C1.Type ='C'then (SELECT SUM(Amount)FROM FINALMIDRESULT c2 WHERE c2.rownum <= C1.rownum) else (SELECT SUM(Amount)-Sum(Amount)FROM FINALMIDRESULT c2 WHERE c2.rownum <= C1。 rownum) 結束爲結果 來自FINALMIDRESULT C1 – Shankaranand

+1

您正在使用哪個版本的sql-server?標記它。你目前的方法有什麼問題,錯誤的結果,錯誤?爲什麼不顯示用於樣品排序的專欄「Slno」? –

回答

0

你需要實現一個seft INNER JOIN來概括所有的值與Slno小於結果當前值如下:

;WITH OriginalData AS 
(  SELECT * 
     FROM 
     (  VALUES 
       (1, 'P', 40), 
       (2, 'C', 20), 
       (3, 'P', 45), 
       (4, 'P', 20), 
       (5, 'C', 10) 
     )  AS Temp(Slno, Type, Amount) 
) 
SELECT  [Current].Type, [Current].Amount, 
      ISNULL(SUM(
      CASE WHEN [Previous].Type = 'P' 
        THEN +[Previous].Amount 
        ELSE -[Previous].Amount 
      END),0) + 
      CASE WHEN [Current].Type = 'P' 
        THEN +[Current].Amount 
        ELSE -[Current].Amount 
      END Result 
FROM  OriginalData [Current] 
LEFT JOIN OriginalData [Previous] 
     ON [Previous].Slno < [Current].Slno 
GROUP BY [Current].Slno, [Current].Type, [Current].Amount 
ORDER BY [Current].Slno 

我認爲你能做出的最大改變是sh如果你的心態。當你認爲「以前的值」時,你選擇了一種可以解決任何主要編程語言的程序路徑,但是在SQL中迅速演變爲遊標方法 - 在這種情況下不適用。

當涉及到SQL時,您需要考慮「設置」,因此您可以努力確定這些數據集並將它們組合在一起。