代码之家  ›  专栏  ›  技术社区  ›  Zoyeb Shaikh

SQL中如何根据条件加减前一行

  •  1
  • Zoyeb Shaikh  · 技术社区  · 5 年前

    我正试图根据 TranslationType

    样本数据:

    Id  TransactionType Value
    -------------------------
    1   Receipt          10
    2   Issue             2
    3   Receipt          10
    4   Issue             5
    5   Issue             3
    

    我试过了,但我有一个问题,我得到的输出是错误的:

    Id  TransactionType DiffValue
    -----------------------------
    1   Receipt          10
    2   Issue             8
    3   Receipt          22
    4   Issue             5
    5   Issue             2
    

    差分值的期望输出:

    Id  TransactionType  Value  DiffValue
    ---------------------------------------
    1   Receipt           10        10
    2   Issue              2         8  if issue then 10-2
    3   Receipt           10        18  if receipt then 10+8 
    4   Issue              5        13  if issue then 18-5
    5   Issue              3        10  if issue then 13-3
    

    SQL创建脚本:

    DROP TABLE #Temp 
    
    CREATE TABLE #Temp
    (
        Id INT,
        TransactionType VARCHAR(50),
        value INT,
    )
    
    INSERT INTO #Temp (Id, TransactionType, value)
    VALUES (1, 'Receipt', 10), (2, 'Issue', 2), (3, 'Receipt', 10),
           (4, 'Issue', 5), (5, 'Issue', 3)
    
    SELECT * FROM #Temp
    

    我的查询尝试:

    SELECT
        Id,
        TransactionType,
        CASE 
           WHEN TransactionType = 'Receipt' 
              THEN SUM(value) OVER (ORDER BY Id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)  
           ELSE LAG(value) OVER (ORDER BY Id)  - value
        END AS DiffValue
    FROM
        #Temp
    
    1 回复  |  直到 5 年前
        1
  •  1
  •   Tim Biegeleisen    5 年前

    你应该总结一下 CASE 可以区分借方和贷方的表达式:

    SELECT 
        Id,
        TransactionType,
        SUM(CASE WHEN TransactionType = 'Receipt' THEN value ELSE -1.0*value END)
            OVER (ORDER BY Id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS DiffValue
    FROM #Temp
    ORDER BY Id;