【问题标题】:How to add conditional sum aggregate column to SQL query which depends on preceding rows?如何将条件总和聚合列添加到依赖于前行的 SQL 查询?
【发布时间】:2017-04-18 08:40:55
【问题描述】:

假设我有下表

|Id|Debtor|Creditor|
| 0|0     |400     |
| 1|1000  |0       |
| 2|2000  |0       |
| 3|0     |5000    |

我需要在每一行上添加两列 TotalDebtTotalCredit,条件是在单行中只有一个总数被填充,另一个为零。 这是我要查找的查询结果。

|Id|Debtor|Creditor|TotalDebt|TotalCredit|
| 0|0     |400     |0        |400        |
| 1|1000  |0       |600      |0          |
| 2|2000  |0       |2600     |0          |
| 3|0     |5000    |0        |2400       |

【问题讨论】:

    标签: sql sql-server sql-server-2016


    【解决方案1】:

    这是一种方法:

    创建和填充示例数据(在您以后的问题中保存我们这一步)

    DECLARE @T AS TABLE
    (
        id int,
        Debtor int,
        Creditor int
    )
    
    INSERT INTO @T VALUES
    (0, 0   , 400 ),
    (1, 1000, 0   ),
    (2, 2000, 0   ),
    (3, 0   , 5000)
    

    使用 cte 作为 Debtor 和 Creditor 列的滚动总和:

    ;WITH CTE AS
    (
        SELECT  id, 
                Debtor, 
                Creditor, 
                SUM(Creditor - Debtor) OVER(ORDER BY ID) As RollingSum
        FROM @T
    )
    

    从 cte 中选择:

    SELECT  Id,
            Debtor,
            Creditor,
            IIF(RollingSum < 0, -RollingSum, 0) As TotalDebt,
            IIF(RollingSum > 0, RollingSum, 0) As TotalCredit
    FROM CTE
    

    结果:

    Id  Debtor  Creditor    TotalDebt   TotalCredit
    0   0       400         0           400
    1   1000    0           600         0
    2   2000    0           2600        0
    3   0       5000        0           2400
    

    See a live demo on rextester.

    【讨论】:

      【解决方案2】:

      试试这个:

      SELECT Id, Debtor, Creditor, 
             IIF(Debtor=0, 0, SUM(Debtor-Creditor) OVER (ORDER BY Id)) AS TotalDebt,
             IIF(Creditor=0, 0, SUM(Creditor-DEbtor) OVER (ORDER BY Id)) AS TotalCredit
      FROM mytable
      

      Demo here

      【讨论】:

      • 如果添加这一行会怎样:4, 100, 0?您的结果将在TotalDebt 列中显示-2300,在TotalCredit 列中显示0...rextester.com/RDCQT51162
      • @ZoharPeled 我认为这是 OP 真正想要的。
      • 嗯,-2300 的总债务实际上是 2300 的总信用,这就是我的建议所显示的。我想我们将不得不等待 OP 做出回应。
      【解决方案3】:

      试试:

      SELECT *,
             case when [Debtor]> 0 then sum([Debtor] - [Creditor] ) over (order by id) 
                  else 0 end as TotalDebt,
             case when [Creditor]> 0 then sum([Creditor] - [Debtor]) over (order by id) 
                  else 0 end as TotalCredit
      FROM table1
      

      演示:http://rextester.com/HQCZQH39439

      【讨论】:

        【解决方案4】:

        使用子查询计算所有小于或等于给定“Id”的条目的总和

        【讨论】:

          【解决方案5】:

          如果您不想使用 IIF(这是特定于版本的),以下查询将为您工作,请尝试以下查询,这将为您提供确切所需的输出:

          DECLARE @TableData AS TABLE(id int,Debtor int,Creditor int)
          
          INSERT INTO @TableData VALUES
          (0, 0, 400 ),
          (1, 1000, 0),
          (2, 2000, 0),
          (3, 0, 5000),
          (4, 10, 0),
          (5, 0, 20)
          
          ;WITH SAMPLEDATA
          AS
          (
              SELECT *,0 TD,Creditor TC FROM @TableData WHERE ID=0
              UNION ALL
              SELECT T2.*,
              CASE WHEN T2.Debtor=0 THEN 0 ELSE T1.TD+(T2.Debtor-T1.Creditor) END,
              CASE WHEN T2.Creditor=0 THEN 0 ELSE T2.Creditor-T1.TD END
               FROM SAMPLEDATA T1 JOIN @TableData T2 ON T1.id=T2.id-1 
          )
          select * from SAMPLEDATA
          

          查询的输出,带有一些额外的虚拟数据:

          ---------------------------------
          id  Debtor  Creditor    TD  TC
          ---------------------------------
          0   0       400     0       400
          1   1000    0       600     0
          2   2000    0       2600    0
          3   0       5000    0       2400
          4   10      0       -4990   0
          5   0       20      0       5010
          ---------------------------------
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-01-19
            • 1970-01-01
            • 2022-01-07
            • 1970-01-01
            • 2023-03-14
            • 2018-10-01
            • 1970-01-01
            • 2012-05-19
            相关资源
            最近更新 更多