SQL:插入具有汇总值的行
Posted
技术标签:
【中文标题】SQL:插入具有汇总值的行【英文标题】:SQL: insert rows with summarized values 【发布时间】:2018-05-04 12:07:25 【问题描述】:请看我的第一个问题:SQL: partition over two columns
我有下表:
----------------------------------
| No1 | No2 | Amount| Timestamp
----------------------------------
| A | B | 10 | 01.01.2018
| C | D | 20 | 02.01.2018
| B | A | 30 | 03.01.2018
| D | C | 40 | 04.01.2018
----------------------------------
我目前有以下结果:
-----------------------------------------------------
| No1 | No2 | Sum(Amount) over partition | Timestamp
-----------------------------------------------------
| A | B | 40 | 01.01.2018
| C | D | 60 | 02.01.2018
| B | A | 40 | 03.01.2018
| D | C | 60 | 04.01.2018
-----------------------------------------------------
使用 SQL(来自 Vamsi Prabhala 回答的第一个问题):
select no1,no2,sum(amount) over(partition by least(no1,no2),greatest(no1,no2)) as total, timestamp
from tbl
我现在的问题是如何在结果中添加行,例如:
----------------------------------------------------
| No1 | No2 | Sum(Amount) over partition | Timestamp
----------------------------------------------------
| A | B | 40 (optional) | 01.01.2018
| B | A | 40 (optional) | 02.01.2018
| AB |(NULL)| 40 |
| C | D | 60 (optional) | 03.01.2018
| D | C | 60 (optional) | 04.01.2018
| CD |(NULL)| 60 |
----------------------------------------------------
请注意,可以有多个行,例如值 (No1=A,No2=B)
更新:添加时间戳列以更具体地实现我想要实现的目标
【问题讨论】:
你真的想把这些行添加到table
吗???或者只是编写一个查询来返回这些示例结果?另外,为什么每个组合都需要三行? (你的AB, NULL, 40
和CD, NULL, 60
行不够吗?其他行告诉你什么?)
@MatBailie 抱歉让您感到困惑。我想得到这个结果,而不是在表中插入行。我需要其他行,因为每个 No1-No2 行都有一些其他相关列
【参考方案1】:
SELECT
LEAST(No1, No2) || ':' || GREATEST(No1, No2) AS set_label,
No1,
No2,
SUM(Amount) AS Amount,
Stamp
FROM
tbl
GROUP BY
GROUPING SETS (
(LEAST(No1, No2), GREATEST(No1, No2), No1, No2, Stamp),
(LEAST(No1, No2), GREATEST(No1, No2))
)
http://sqlfiddle.com/#!4/9afd5/18
如果每一行都有一个唯一的标识符会更好...
http://sqlfiddle.com/#!4/e9e95/1
【讨论】:
我需要其他行,因为每行还有一些其他列,例如时间戳。我将更新问题以更具体【参考方案2】:一种方法是UNION ALL
:
select no1, no2,
sum(amount) over (partition by least(no1, no2), greatest(no1, no2)) as total
from tbl
union all
select least(no1, no2) || greatest(no1, no2), NULL, sum(amount)
from tbl
group by least(no1, no2), greatest(no1, no2);
【讨论】:
以上是关于SQL:插入具有汇总值的行的主要内容,如果未能解决你的问题,请参考以下文章