使用当前行中的字段将增量应用于上一行

时间:2011-03-24 20:59:36

标签: sql common-table-expression row-number

我有一个像这样设置的临时表:

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!

提前致谢!

2 个答案:

答案 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