应用提升到前一行,利用当前行
问题描述:
场我有一个临时表中设置了这样的,然后将其添加到当前的总数...以提出新的总数!应用提升到前一行,利用当前行
Type Rate TotalCost
---- ---- ---------
Type1 0.01 3276
Type2 0.01 3308.76
Type3 0.01 3341.85
因此3276的1%是32.76。
3276 + 32.76 = 3308.76。
3308的1%是33.08。
3308.76 + 33.08 = 3341.85。
依此类推。
我试图创建一个CTE,像这样..
;with cte
as
(
select Type, Rate, TotalCost, row_number() over (order by SortOrder asc) as RowNum
from @Types
)
select cur.RowNum, cur.Rate, prev.Rate, cur.TotalCost, isnull(prev.TotalCost * cur.Rate, cur.TotalCost) as NewTotal
from cte cur
left join cte prev on prev.RowNum = cur.RowNum + 1
...但它不工作:(
谁能帮助?
我使用的是SQL Server 2005中!
在此先感谢!
答
我发现最好的办法是写一个循环:
DECLARE @Temp TABLE
(
Id INT IDENTITY(1,1),
Type VARCHAR(10),
Rate FLOAT,
TotalCost MONEY
)
INSERT INTO @Temp (Type, Rate, TotalCost)
VALUES ('Type1', 0.01, 3276.00),
('Type2', 0.01, 3276.00),
('Type3', 0.01, 3276.00)
DECLARE @CurrentId INT,
@Total INT,
@PreviousCalc MONEY
SET @CurrentId = 1
SELECT @Total = MAX(Id) FROM @Temp
WHILE (@CurrentId <= @Total)
BEGIN
SELECT @PreviousCalc = Rate * TotalCost
FROM @Temp
WHERE Id = @CurrentId - 1
UPDATE @Temp
SET TotalCost = TotalCost + ISNULL(@PreviousCalc, 0)
WHERE Id = @CurrentId
SET @CurrentId = @CurrentId + 1
END
SELECT * FROM @Temp
答
从您的示例结果看来,您似乎正在求和所有以前的行,而不是最后一行。您可以在没有CTE的情况下执行此操作,例如:
declare @YourTable table (type varchar(15), rate float, TotalCost money)
insert @YourTable values
('Type1', 0.01, 3276.00),
('Type2', 0.01, 3276.00),
('Type3', 0.01, 3276.00);
select cur.Type
, case
when sum(prev.rate) is null then 0
else sum(prev.rate * prev.TotalCost)
end + cur.TotalCost
from @YourTable cur
left join
@YourTable prev
on prev.type < cur.type
group by
cur.type
, cur.TotalCost
一个问题是您的示例数据中没有排序顺序。我在这里排序我希望你的真实表格中有更好的排序顺序!
另一个问题是只有第一行的TotalCost
很重要。对于以下行,成本是从第一行的成本和其他行的速率中导出的。