SQL查询如何同时返回按国家分组的客户量与全表全局总客户量
SQL实现分组聚合+全局总计算的两种方案
方案1:窗口函数实现(推荐,适配MySQL 8.0+、PostgreSQL、SQL Server等主流新版数据库)
利用窗口函数的全局聚合特性,不加PARTITION BY的OVER()从句会基于全表结果计算聚合值,仅需扫描一次表,性能和语法简洁度都更优:
SELECT CountryName, SUM(CustomerAmount) AS customerAmount, SUM(SUM(CustomerAmount)) OVER () AS totalAmount FROM test GROUP BY CountryName;
方案2:子查询关联实现(兼容不支持窗口函数的旧版数据库)
先分别计算每个国家的分组聚合结果、全表总客户量,再通过笛卡尔关联把全局总量拼接到每一行结果中:
SELECT t.CountryName, t.customerAmount, total.totalAmount FROM ( -- 按国家分组计算单国客户总量 SELECT CountryName, SUM(CustomerAmount) AS customerAmount FROM test GROUP BY CountryName ) t CROSS JOIN ( -- 单独计算全表所有客户的总数量 SELECT SUM(CustomerAmount) AS totalAmount FROM test ) total;
两种方案执行后输出结果均和目标结果完全一致。
内容的提问来源于stack exchange,提问作者user17127038
相关产品推荐
相关产品推荐

