How to SUM() over column with reset condition?

后端 未结 2 552
逝去的感伤
逝去的感伤 2021-01-03 16:05

I\'m using Postgresql 9.2 and I need to sum quantitys from buttom up with initial value of 100, however if I encounter a row with name X i need to restart the SUM from the

2条回答
  •  太阳男子
    2021-01-03 16:31

    You need a RECURSIVE query

    SQL FIDDLE DEMO

    WITH RECURSIVE t("itemorder", "name", "qty", "modifyed_sum", "level") AS (
        SELECT "itemorder", 
               "name", 
               "qty", 
               100 +  CASE 
                         WHEN "name" = 'A' THEN "qty"
                         ELSE 0
                      END as "modifyed_sum",
               "itemorder" as "level"
         FROM myTable
         WHERE "itemorder" = (SELECT max("itemorder") FROM myTable)
         UNION ALL
         SELECT myTable."itemorder", 
                myTable."name", 
                myTable."qty", 
                CASE 
                    WHEN myTable."name" = 'A' THEN t."modifyed_sum" + myTable."qty"
                    WHEN myTable."name" = 'X' THEN myTable."qty"
                    ELSE t."modifyed_sum"          
                END as "modifyed_sum",
               myTable."itemorder" as "level"
         FROM myTable 
         JOIN t
           ON myTable."itemorder" + 1 = t."itemorder" 
          AND myTable."itemorder" = t."level" - 1
         WHERE  myTable."itemorder" > 0        
    )
    SELECT *
    FROM t
    ORDER BY "itemorder"
    

    OUTPUT

    | itemorder | name | qty | modifyed_sum | level |
    |-----------|------|-----|--------------|-------|
    |         1 |    A | -20 |           20 |     1 |
    |         2 |   A2 | 350 |           40 |     2 |
    |         3 |    X |  40 |           40 |     3 |
    |         4 |    A |  50 |          140 |     4 |
    |         5 |    A | -10 |           90 |     5 |
    |         6 |   A2 |  10 |          100 |     6 |
    

提交回复
热议问题