【问题标题】:SQL cumulative sum until a flag value and resetting the sumSQL 累积总和直到一个标志值并重置总和
【发布时间】:2019-01-17 15:18:09
【问题描述】:

我仍在学习 SQL,并试图找出一个我无法解决的问题。所以我的问题是我正在尝试选择一个按日期排序的表(比如说费用),并且在表中我有一个名为 Charged 的​​列,我想将费用添加为累积的(这部分我想通了)。但是,在那之后,我有另一列将充当名为 PayOut 的标志。当 PayOut 值为 1 时,我希望 Charged(SumValue) 的总和重置为零。我该怎么做?这是我尝试过的,我得到的当前输出和我想要的输出。注意:我看到一些使用 CTE 的帖子,但不是相同的场景并且更复杂。

select ex.date, 
       ex.Charged,
       (case when(ex.PayOut=1) then 0 
             else sum(ex.Charged) over (order by ex.date)end) as SumValue, 
      ex.PayOut
from Expense ex 
order by ex.date asc

数据是这样的

Date       Charged   PayOut
01/10/2018   10        0
01/20/2018   5         0
01/30/2018   3         0
02/01/2018   0         1
02/11/2018   12        0
02/21/2018   15        0

我得到的输出

Date       Charged   PayOut  SumValue
01/10/2018   10        0        10
01/20/2018   5         0        15
01/30/2018   3         0        18
02/01/2018   0         1        0
02/11/2018   12        0        30
02/21/2018   15        0        45

想要的输出

Date       Charged   PayOut  SumValue
01/10/2018   10        0        10
01/20/2018   5         0        15
01/30/2018   3         0        18
02/01/2018   0         1        0
02/11/2018   12        0        12
02/21/2018   15        0        27

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    只需从您的 PayOut 列创建组并将其用作 OVER 中的分区

    WITH Expense AS (
                  SELECT CAST('01/10/2018' AS DATE) AS Date, 10 AS Charged, 0 AS PayOut
        UNION ALL SELECT CAST('01/20/2018' AS DATE), 5, 0
        UNION ALL SELECT CAST('01/30/2018' AS DATE), 3, 0
        UNION ALL SELECT CAST('02/01/2018' AS DATE), 0, 1
        UNION ALL SELECT CAST('02/11/2018' AS DATE), 12, 0
        UNION ALL SELECT CAST('02/21/2018' AS DATE), 15, 0
    )
    SELECT
         dat.date
        ,dat.Charged
        ,dat.PayOut
        ,dat.PayOutGroup
        ,SUM(dat.Charged) OVER (PARTITION BY dat.PayOutGroup ORDER BY dat.date) as SumValue
    FROM (
        SELECT 
             e.date
            ,e.Charged
            ,e.PayOut
            ,SUM(e.PayOut) OVER (ORDER BY e.date) AS PayOutGroup
        FROM Expense e
    ) dat
    

    【讨论】:

    • 谢谢你的作品。如果 Charged 从 0 更改为 10 并且 Payout 仍然为 1 而 SumValue 为 0(因为 payout 为 1),我确实会进行跟进。逻辑是否必须改变很多?
    猜你喜欢
    • 1970-01-01
    • 2020-08-24
    • 2021-03-26
    • 2020-08-20
    • 2020-11-28
    • 2020-03-30
    • 1970-01-01
    • 2021-05-22
    • 1970-01-01
    相关资源
    最近更新 更多