如何在具有复位条件的列上求和(SUM())? [英] How to SUM() over column with reset condition?

查看:68
本文介绍了如何在具有复位条件的列上求和(SUM())?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用的是Postgresql 9.2,我需要从buttom开始对数量进行求和,初始值为100,但是如果遇到名称为X的行,则需要从该行的qty值重新启动SUM。



例如:

 商品名称数量
1 A- 20
2 A2 350
3 X 40
4 A 50
5 A -10
6 A2 10

应生成:

 商品名称数量tydmodified_sum 
1 A -20 20/40 +(-20)
2 A2 350 40 /不是A
3 X 40 40 /遇到X,以X数量重新开始求和。
4 A 50140/90 + 50
5 A -10 90/100 +(-10)
6 A2 10100 /不是A

我使用此查询来求和:

  SELECT 100 +总和(当名称='a'的情况下,那么数量为0结束)超过(按物料订单DESC排序),为
数量,
名称,
物料订单
FROM Table_Name
OR BY BY itemorder ASC

如何修改它以处理X大小写? (可以有多个X)

解决方案

您需要 递归 查询



SQL FIDDLE DEMO

 具有递归t( itemorder, name, qty, modifyed_sum, level)AS(
选择 itemorder,
name,
qty,
100 +情况
当 name ='A'然后 qty
ELSE 0
结尾为 Modifyed_sum,
itemorder为 level
从myTable
WHERE itemorder =(从myTable中选择SELECT max( itemorder))
UNION ALL
SELECT myTable。 itemorder,
myTable。 name,
myTable。 qty,
CASE
当myTable。 name ='A'然后t 。 modifyed_sum + myTable。 qty
,当myTable。 name ='X'THEN myTable。 qty
ELSE t。 modifieded_sum
END为 modifyed_sum,
myTable。 itemorder作为级别,从myTable
加入myTable上的t
。 itemorder +1 = t。 itemorder
和myTable。 itemorder = t。级别-1
在myTable中。 itemorder> 0

选择*
从t
通过 itemorder订购

输出

  |商品订单|名称|数量Modifyed_sum |级别| 
| ----------- || ---- | ----- | -------------- | ----- -|
| 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 |


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 value of qty in this row.

for example:

itemorder   name    qty
  1          A       -20
  2          A2       350
  3          X        40
  4          A        50
  5          A        -10
  6          A2       10

Should generate:

itemorder   name    qty       modifyed_sum
  1          A       -20          20       / 40 + (-20)
  2          A2       350         40       / not A
  3          X        40           40       / encounter X, restart sum with X qty.
  4          A        50          140       / 90 + 50
  5          A        -10         90        / 100 +  (-10)
  6          A2       10          100       / not A

I used this query to do the Sum:

SELECT 100 + Sum(CASE WHEN name = 'a' THEN qty ELSE 0 END)OVER(ORDER BY itemorder DESC) as modifyed_sum,
       qty,
       name,
       itemorder
FROM   Table_Name
ORDER  BY itemorder ASC

How can I modify it to handel the X case? (There can be more than one X)

解决方案

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 |

这篇关于如何在具有复位条件的列上求和(SUM())?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆