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

How to group by a param but also include the total aggregated (ungrouped by)?

我在 Postgres 9.3.6 中有一个 table,看起来像这样:

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

我想 运行 SQL 查询以 valueutm_source 求和,但也包括总值。所以最后的 table 应该是这样的:

utm_source    sum
fb            20
google        7
null          5
all           32

这是我原本会使用的:

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

但我也想要里面的 all

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

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

使用 CTE 使基数 table 只被扫描一次,这通常更快。 CTE 有一些间接费用,因此它可能无法支付非常小的 tables。

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 服务器使用 grouping()rollup() 关键字对任务进行了非标准扩展。以下是如何在 Postgres 中实现它: