2014-10-28 80 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