Отказ от ответственности : это решение для PostgreSQL версий 9.0-9.4.Для Postgres 9,5 или выше я бы выбрал решение GROUPING SETS
@ LaurenzAlbe
demo: db <> fiddle
WITH count_nations AS ( -- A
SELECT
*,
sum(students) OVER (PARTITION BY short) as total -- B
FROM nations
)
SELECT short, name, students FROM count_nations -- C
UNION -- E
SELECT short, NULL, total FROM count_nations -- D
ORDER BY
short,
name NULLS LAST, -- F
students
A: WITH
предложение делает запрос более читабельным, поскольку вам не нужно писать один и тот же подзапрос дважды.
B: оконная функция (https://www.postgresql.org/docs/current/static/tutorial-window.html) SUM
подводит итогвсе значения в данном кадре (здесь столбец short
). Таким образом, вы получаете общее количество стран в виде отдельного столбца.
Результат подзапроса:
short name students total
A A 604 10711
A Austria 6707 10711
A Österreich 3400 10711
AFG Afg 18 2009
AFG Afghanistan 1991 2009
AGL Angola 16 16
AGN Guinea 2 2
AL Al 5 66
AL Albanien 61 66
ARM Arm 6 93
ARM Armenien 87 93
C:Выбор исходных столбцов ...
D: Выбор нового столбца без имени ...
E: UNION
оба результата. UNION
делает результат отличным, поэтому вы получаететолько одна строка на страну. (UNION ALL
не будет отличаться)
F: упорядочение результата. Для строк нации значения NULL
должны быть последними.
Результат:
short name students
A A 604
A Austria 6707
A Österreich 3400
A 10711
AFG Afg 18
AFG Afghanistan 1991
AFG 2009
AGL Angola 16
AGL 16
AGN Guinea 2
AGN 2
AL Al 5
AL Albanien 61
AL 66
ARM Arm 6
ARM Armenien 87
ARM 93
В вашем примере вы добавляете дополнительную строку только для тех стран, у которых более одной строки. Например, для AGN
yoты не добавляешь строку.Если это ваше намерение, то указанная выше скрипта db <> показывает вам решение:
- Добавление счетчика строк для каждой оконной рамы в предложение
WITH
- Фильтр
UNION
подзапрос для всех стран с row_count > 1