Как сгруппировать по параметру, но также включить общее агрегированное (разгруппированное)?

У меня есть таблица в Postgres 9.3.6, которая выглядит так:

utm_source    value
fb            12
fb            8
google        3
google        4
null          5

Я хочу запустить SQL-запрос для суммирования value на utm_source, но также включить общее значение. Итак, итоговая таблица должна выглядеть так:

utm_source    sum
fb            20
google        7
null          5
all           32

Это то, что я бы использовал иначе:

SELECT SUM(value) as sum FROM my_table GROUP BY utm_source;

Но я тоже хочу all!


person Some Guy    schedule 03.04.2015    source источник
comment
ROLLUP или GROUPING SETS — это некоторые варианты, и в этом вопросе есть несколько вариантов: stackoverflow.com/q/14478361/84206   -  person AaronLS    schedule 04.04.2015
comment
Отметьте свою СУБД, так как могут быть решения для конкретной платформы.   -  person crthompson    schedule 04.04.2015
comment
Это постгрес 9.3.6   -  person Some Guy    schedule 04.04.2015


Ответы (2)


Используя CTE, чтобы базовая таблица сканировалась только один раз, что обычно быстрее. Существуют некоторые накладные расходы на CTE, поэтому он может не окупить тривиально маленькие таблицы.

WITH cte AS (
   SELECT utm_source, sum(value) AS sum_value
   FROM   tbl
   GROUP  BY 1
   )
SELECT * FROM cte
UNION ALL  -- not just UNION !
SELECT 'all', sum(sum_value) FROM cte;

SQL Server имеет нестандартное расширение задачи с использованием ключевых слов grouping() и rollup(). Вот как это реализовать в Postgres:

person Erwin Brandstetter    schedule 03.04.2015

SELECT isnull(utm_source,'')
       ,SUM(value) as sum 
FROM my_table 
GROUP BY isnull(utm_source,'') with rollup

вы можете обновить NULL до «всех» позже.

person Zee    schedule 03.04.2015
comment
ОП сначала не разъяснил СУБД. Это Postgres, rollup является нестандартной функцией SQL Server и не работает в Postgres. Подробности: dba.stackexchange.com/questions/ 94817/ - person Erwin Brandstetter; 04.04.2015