如何在具有复位条件的列上求和(SUM())? [英] How to SUM() over column with reset condition?
本文介绍了如何在具有复位条件的列上求和(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)
解决方案
您需要 递归 查询
具有递归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
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屋!
查看全文