2014-10-28 76 views
3

總值我使用SQL Server 2012,並有一個表,如下圖所示:SQL服務器計算運行與查詢

DECLARE @T TABLE(Id INT, [Type] CHAR(1), Quantity INT, Price MONEY, UnitPrice AS (Price/Quantity)) 
INSERT INTO @T VALUES 
    (1, 'I', 30, 1500), 
    (2, 'O', 5, NULL), 
    (3, 'O', 20, NULL), 
    (4, 'O', 2, NULL), 
    (5, 'I', 10, 2500), 
    (6, 'I', 8, 1000), 
    (7, 'O', 3, NULL), 
    (8, 'O', 10, NULL), 
    (9, 'I', 12, 3600) 

在我的桌子我有一個類型列使用值('I' and 'O')我有單價爲「I」型記錄和最後使用的'O'類型記錄'I'鍵入記錄值我想計算RunningTotalPrice(每行數量*單價)。

下面的代碼計算RunningTotalQuantity:

SELECT *, 
     SUM(CASE WHEN [Type] = 'I' Then Quantity ELSE -Quantity END)OVER (ORDER BY Id) AS QuantityRunningTotal 
FROM @T 

與此查詢的結果是:

Id Type Quantity Price UnitPrice QuantityRunningTotal 
1 I  30   1500/00 50/00  30 
2 O  5   NULL NULL  25 
3 O  20   NULL NULL  5 
4 O  2   NULL NULL  3 
5 I  10   2500/00 250/00  13 
6 I  8   1000/00 125/00  21 
7 O  3   NULL NULL  18 
8 O  10   NULL NULL  8 
9 I  12   3600/00 300/00  20 

我想有以下結果

Id Type Quantity Price UnitPrice QuantityRunningTotal Price  RunningTotalPrice 
1 I  30   1500/00 50/00  30     1500/00  1500/00 
2 O  5   NULL 50/00  25     250/00  1250/00 
3 O  20   NULL 50/00  5      1000/00  250/00 
4 O  2   NULL 50/00  3      100/00  150/00 
5 I  10   2500/00 250/00  13     2500/00  2650/00 
6 I  8   1000/00 125/00  21     1000/00  3650/00 
7 O  3   NULL 125/00  18     375/00  3275/00 
8 O  10   NULL 125/00  8      1250/00  2025/00 
9 I  12   3600/00 300/00  20     3600/00  5625/00 

在這個結果空單價列值最後在記錄之前存在單位價格。 並計算價格(Quantity * UnitPrice)和計算價格的運行總額。

+0

我仍然沒有得到第二個「價格」列 – Alireza 2014-10-28 08:44:19

+0

第二個價格按Quantity * UnitPrice計算,並等於'I'Type記錄的第一個價格。 – 2014-10-28 08:47:04

回答

1

不幸的是LEADLAG功能無法使用到最後不NULL值,所以你需要使用OUTER APPLY獲得以前UnitPrice行其中類型爲「O」的使用方法:

SELECT t.ID, 
     t.[Type], 
     t.Quantity, 
     t.Price, 
     t.UnitPrice, 
     SUM(CASE WHEN t.[Type] = 'I' THEN t.Quantity ELSE -t.Quantity END) OVER (ORDER BY t.Id) AS QuantityRunningTotal, 
     CASE WHEN t.[Type] = 'I' THEN t.Price ELSE t.Quantity * p.UnitPrice END AS Price2, 
     SUM(CASE WHEN t.[Type] = 'I' THEN t.Price ELSE -t.Quantity * p.UnitPrice END)OVER (ORDER BY t.Id) AS QuantityRunningTotal 
FROM @T AS t 
     OUTER APPLY 
     ( SELECT TOP 1 t2.UnitPrice 
      FROM @T AS t2 
      WHERE t2.ID < t.ID 
      AND  t2.UnitPrice IS NOT NULL 
      ORDER BY t2.ID DESC 
     ) AS p; 
+0

坦克爲您的答案。我的原始表格有超過1000萬條記錄,您的查詢速度很慢。我尋找一個高性能的查詢。謝謝 – 2014-10-28 10:04:29

+1

@mehdilotfi子查詢通常比窗口函數更快。嘗試添加索引到ID。或者,您可以編寫腳本填寫空值 – 2014-10-28 11:13:37