Рекурсивное общее табличное выражение

Я знаю, что, вероятно, поступаю неправильно, но я пытаюсь понять рекурсивные CTE.

Я создал простую таблицу

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

Идея заключалась в том, чтобы привязать сумму 10, чтобы рекурсивно перебрать и удалить сумму из общей суммы.

Я придумал ниже

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  

Какой ессно не работает.

Есть идеи?

1 ответ

Решение

Не уверен, что у вас не работает и что именно вы действительно хотите.....

Но что-то вроде этого должно работать:

;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 начинается с 10.00 и затем последовательно вычитает другие суммы - это то, что вы ищете?

Другие вопросы по тегам