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, 40CD, 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:插入具有汇总值的行的主要内容,如果未能解决你的问题,请参考以下文章

连接具有空值的汇总数据 - SQL Server

在一列中对具有相同数据的行进行分组,并将其相关数据汇总在另一列中 [ORACLE SQL]

如何将转换后的行汇总并集中到一个具有相同 ID 的字段中?

第十二章:汇总数据

汇总数据

聚合具有特定值的两行之间的行