1

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

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!

提前致谢!

4

2 回答 2

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第一行的重要。对于以下行,成本源自第一行的成本和其他行的费率。

于 2011-03-24T21:22:02.283 回答
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
于 2011-03-25T07:08:48.200 回答