2011-12-09 10 views
2

私はおそらくこれについて間違った方法をとっていると知っていますが、再帰的なCTEを理解しようとしています。 再帰的な共通テーブル式

私は考えは、量10の貫通に再帰的にループを固定し、トータルの量を除去することであった単純なテーブル

RowNum Type Amount 
1  Anch 10 
2  Amt  1 
3  Amt  2 
4  Amt  3 
5  Amt  4 

を作成しました。

私は以下の

OBVは動作しません
WITH cte_Rec (RowNum, [Type], Amount, Amount2, RT, RN) 
    AS (SELECT RowNum, 
       [Type], 
       Amount, 
       Amount, 
       Amount, 
       RowNum 
     FROM dbo.tbl_RecursiveCTE 
     WHERE [Type] = 'Anch' 
     UNION ALL 
     SELECT r.RowNum, 
       r.[Type], 
       r.Amount, 
       ct.Amount, 
       ct.Amount - r.Amount AS RT, 
       ct.RowNum 
     FROM dbo.tbl_RecursiveCTE r 
       INNER JOIN cte_Rec ct 
        ON ct.RowNum = r.RowNum - 1) 
SELECT * 
FROM cte_Rec 

を思い付きました。

アイデア?

+0

希望の結果は何ですか? –

+0

アンカー値を取得し、それから反復的に「amt」値を削除する。 –

+1

そのサンプルデータの希望する結果を表形式で入力し、質問に編集してください。 –

答えて

3

わからないはあなたのために動作しないと、まさにあなたが本当にしたい.....

しかし、このようなものは動作するはずです:

;WITH cte_Rec AS 
(
    SELECT RowNum, RowType, Amount AS 'Amount', Amount AS 'SumAmt' 
    FROM dbo.tbl_RecursiveCTE 
    WHERE RowType = 'Anch' 

    UNION ALL 

    SELECT r.RowNum, r.RowType, r.Amount, CAST(ct.SumAmt - r.Amount AS DECIMAL(18,2)) 
    from dbo.tbl_RecursiveCTE r 
    INNER JOIN cte_Rec ct on ct.RowNum = r.RowNum - 1 
) 
SELECT * 
FROM cte_Rec 

私はの出力が得られます。

RowNum RowType Amount SumAmt 
1  Anch  10.00 10.00 
2  Amt  1.00 9.00 
3  Amt  2.00 7.00 
4  Amt  3.00 4.00 
5  Amt  4.00 0.00 

Amount行は、その特定の行の量を示しているとSumAmt開始そしてそれから連続して他の金額を引きます - それはあなたが探しているものですか?

+0

まさに私が何をしているのですか!ランニング・トータル/サム・アムは私が苦労していたものです。ありがとう –