Применить увеличение к предыдущей строке, используя поле из текущей строки - PullRequest
1 голос
/ 24 марта 2011

У меня временная таблица настроена так:

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

Таким образом, 1% из 3276 составляет 32,76.

3276 + 32,76 = 3308,76.

1% из 3308 составляет 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 ]

1 голос
/ 25 марта 2011

Из результатов вашего примера видно, что вы суммируете все предыдущие строки, а не только последнюю. Вы можете сделать это без 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 первого ряда. Для следующих строк стоимость получается из стоимости первых строк и ставки других строк.

0 голосов
/ 25 марта 2011

Лучший способ, который я нашел, это написать цикл:

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
...