sql - 递归公用表表达式

标签 sql sql-server t-sql common-table-expression

我知道我可能会以错误的方式处理这个问题,但我正在尝试理解递归 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  

哪个 obv 不起作用。

有什么想法吗?

最佳答案

不确定什么不适合您以及您真正想要什么......

但是像这样的东西应该有效:

;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 行显示该特定行的金额,而 SumAmt10.00 开头,然后连续减去其他金额 - 是这就是你要找的?

关于sql - 递归公用表表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8448581/

相关文章:

sql - 修复 Amazon Redshift 上计算 DAU 和 MAU 时的 MAU 问题

sql-server - SQL 服务器的最佳 RAID 设置

sql-server - FreeTDS 无法从 odbc.ini 读取服务器名称

t-sql - 删除除(我的查询)之外的所有行

sql-server - SQL 根据列值拉回最新的不同记录

sql - 如何将逗号分隔的值转换为oracle中的行?

mysql - MySQL 中何时使用单引号、双引号和反引号

sql - 从多对多表查询中选择

python - MS SQL + Python (IronPython) 超时

sql - 在 Azure SQL 数据库中使用 "INSERT INTO"SQL 查询时出错