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