2015-04-06 68 views
0

在下面的鏈接表:計算列依賴於前面的行

enter image description here

ТheResult列這是一個T-SQL查詢,其中每個記錄反映чproduct-modelч的從運動的結果通過賬單向另一個賬戶轉賬:如果amountemployee轉移,則金額將填入Amount_Out列,反之亦然。

例如:行3和4表明,40個產品的hpemp1移動到emp3通過紙幣與代碼111。此運動將emp1的此產品的總量減少爲60,並將emp3的同一產品的總量增加爲40

現在我需要在查詢來計算每條記錄的結果顯示產品在員工的保管總量直至記錄日期:

結果=所有先前計算的金額賬單+ Amount_In - Amount_Out

這意味着結果將取決於以前的記錄值。 SQL Server 2008中的查詢如何實現?哪個是最好的實現它,存儲過程還是視圖?

+1

能否請您編輯您的問題,併發布表中的文本,以便我們可以使用它? – StuartLC 2015-04-06 08:03:26

+0

聽起來就像一個跑步總數。如果是這樣的話,可以提供很多例子。 – 2015-04-06 08:08:35

回答

0

你可以用相關的子查詢來做到這一點。更改AND it.No <= ot.NoAND it.Date <= ot.Date如果No s爲不連續的:

DECLARE @t TABLE 
    (
     No INT , 
     Employee CHAR(4) , 
     Model CHAR(4) , 
     Date DATE , 
     Bill CHAR(3) , 
     Income MONEY , 
     Outcome MONEY 
    ) 

INSERT INTO @t 
VALUES (1, 'emp1', 'hp', '20140101', '000', 100, 0), 
     (2, 'emp1', 'dell', '20140101', '000', 100, 0), 
     (3, 'emp1', 'hp', '20140308', '111', 0, 40), 
     (4, 'emp3', 'hp', '20140308', '111', 40, 0), 
     (5, 'emp3', 'hp', '20140408', '222', 0, 20), 
     (6, 'emp2', 'hp', '20140408', '222', 20, 0), 
     (7, 'emp1', 'hp', '20140608', '333', 0, 5), 
     (8, 'emp2', 'hp', '20140608', '333', 5, 0), 
     (9, 'emp1', 'dell', '20150101', '444', 0, 40) 


SELECT * , 
     (SELECT SUM(Income - Outcome) 
      FROM  @t it 
      WHERE  it.Model = ot.Model 
        AND it.Employee = ot.Employee 
        AND it.No <= ot.No 
     ) AS Result 
FROM @t ot 

輸出:

No Employee Model Date  Bill Income Outcome Result 
1 emp1  hp  2014-01-01 000  100.00 0.00 100.00 
2 emp1  dell 2014-01-01 000  100.00 0.00 100.00 
3 emp1  hp  2014-03-08 111  0.00 40.00 60.00 
4 emp3  hp  2014-03-08 111  40.00 0.00 40.00 
5 emp3  hp  2014-04-08 222  0.00 20.00 20.00 
6 emp2  hp  2014-04-08 222  20.00 0.00 20.00 
7 emp1  hp  2014-06-08 333  0.00 5.00 55.00 
8 emp2  hp  2014-06-08 333  5.00 0.00 25.00 
9 emp1  dell 2015-01-01 444  0.00 40.00 60.00 
0

SQL 2008不能訪問到Sql2012的其他分析功能,如超前滯後,所以你需要採取一種解決方法,如these here

下面是一個遞歸CTE實現的例子。

請注意,這取決於能夠在員工,ProductModel分組中連續編號(1,2,3等)而沒有任何歧義,因爲這用於JOIN條件(Sequence to Sequence + 1 )。例如,如果存在關係,你會得到不穩定的結果。

SqlFiddle here

0

您可以通過一個簡單的子查詢得到的結果。

SELECT No,Employee,Product_Model,[Date],Bill_Code,Amount_In,Amount_Out, 
(
    SELECT SUM 
    (
     SELECT D1.Amount_In - D0.Amount_Out AS subTotal 
     FROM Table_Name AS D1 
     WHERE 
     (
      D1.[Date] < D0.[Date] 
     ) 
     OR 
     (
      D1.[Date] = D0.[Date] 
      AND 
      D1.No <= D0.No 
     ) 
    ) 
) AS Result 
FROM Table_Name D0 
ORDER BY D0.No, D0.[Date] 

與實際輸出應該是:

No Employee Product_Model Date  Bill_Code Amount_In Amount_Out Result 
1 emp1  hp    2014-01-01 000   100.00  0.00   100.00 
2 emp1  dell   2014-01-01 000   100.00  0.00   200.00 
3 emp1  hp    2014-03-08 111   0.00  40.00  160.00 
4 emp3  hp    2014-03-08 111   40.00  0.00   200.00 
5 emp3  hp    2014-04-08 222   0.00  20.00  180.00 
6 emp2  hp    2014-04-08 222   20.00  0.00   200.00 
7 emp1  hp    2014-06-08 333   0.00  5.00   195.00 
8 emp2  hp    2014-06-08 333   5.00  0.00   200.00 
9 emp1  dell   2015-01-01 444   0.00  40.00  160.00 
+0

嗨,@ Jamal3223,你想要什麼正確的「結果」列? – 2015-04-06 23:59:58