如何按参数分组但也包括总聚合(未分组依据)?
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 查询以 value
与 utm_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 中实现它:
我在 Postgres 9.3.6 中有一个 table,看起来像这样:
utm_source value
fb 12
fb 8
google 3
google 4
null 5
我想 运行 SQL 查询以 value
与 utm_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 中实现它: