Рекурсивное общее табличное выражение - PullRequest
2 голосов
/ 09 декабря 2011

Я знаю, что, вероятно, я поступаю неправильно, но я пытаюсь понять рекурсивные 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 Ответ

3 голосов
/ 09 декабря 2011

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

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

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

...