2011-03-24 102 views
1

场我有一个临时表中设置了这样的,然后将其添加到当前的总数...以提出新的总数!应用提升到前一行,利用当前行

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

我发现最好的办法是写一个循环:

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 
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很重要。对于以下行,成本是从第一行的成本和其他行的速率中导出的。