如何按参数分组但还包括总聚合(未分组)?

时间:2015-04-03 21:50:21

标签: sql postgresql aggregate rollup

我在Postgres 9.3.6中有一个表格如下:

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

我希望运行SQL查询以valueutm_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在那里!

2 个答案:

答案 0 :(得分:1)

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

您可以稍后将NULL更新为“all”。

答案 1 :(得分:1)

使用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中实现它: