SQL: вставьте строки с суммированными значениями - PullRequest
0 голосов
/ 04 мая 2018

см. Мой первый вопрос к моей теме: SQL: разделение на две колонки

У меня есть следующая таблица:

----------------------------------
| 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 (из первого вопроса с ответом Вамси Прабхалы):

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)

ОБНОВЛЕНИЕ: добавлен столбец отметки времени, чтобы быть более точным, чего я хочу достичь

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Один метод - 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);
0 голосов
/ 04 мая 2018
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

...