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

1 つの問題は、サンプル データに並べ替え順序がないことです。ここではタイプでソートしています。実際のテーブルでより良い並べ替え順序があることを願っています!

もう 1 つの問題は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 に答える