我有一个像这样设置的临时表:
Type Rate TotalCost
---- ---- ---------
Type1 0.01 3276.00
Type2 0.01 3276.00
Type3 0.01 3276.00
但是,我需要采用当前行的速率,乘以之前的总数,然后将其添加到当前总数中......以得出新的总数!
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!
提前致谢!
答案 0 :(得分:1)
从您的示例结果中,您看起来像是在汇总所有之前的行,而不仅仅是最后一行。你可以在没有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
很重要。对于以下行,成本来自第一行的成本和其他行的成本。
答案 1 :(得分:0)
我发现的最好方法是写一个循环:
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