我使用SQL Server 2012并拥有如下表格:
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')
的类型列我的单位价格为'我'输入记录和' O'最后使用的类型记录'我'类型记录值我想计算RunningTotalPrice(每行的数量和* UnitPrice)。
以下代码计算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
在此结果中,Null Unitprice列使用记录之前的最后存在的unitprice进行估值。 并计算价格(数量*单位价格)和计算运行总价格。
答案 0 :(得分:1)
不幸的是,LEAD
和LAG
函数不能用于最后一个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;