SQL查询:如何在分组统计城市人口时同时展示全表人口总计?
实现带全表人口总计的城市人口统计查询
现有一张名为Population的表,表结构及数据如下:
City Building_no population Chicago 5 10 Chicago 6 20 Denver 8 25 Denver 9 30
目前已通过以下SQL语句查询出各城市的人口总和:
select city, sum(population) from population group by city
现在需要在查询结果中增加Total_Population列(全表人口总计,值为85),得到如下期望输出:
City City_Population Total_Population Chicago 30 85 Denver 55 85
解决方案
以下提供几种适配主流数据库的实现方式:
方法1:使用窗口函数(推荐,支持MySQL 8.0+、PostgreSQL、SQL Server等)
利用窗口函数直接计算全表级别的总和,无需额外关联操作:
SELECT city, SUM(population) AS City_Population, SUM(SUM(population)) OVER() AS Total_Population FROM population GROUP BY city;
外层的SUM(SUM(population)) OVER()会自动计算所有分组后城市人口的总和,即全表人口总计。
方法2:子查询获取全表总计(兼容低版本数据库)
如果数据库不支持窗口函数,可通过子查询单独计算全表总和,再与分组结果关联:
SELECT p.city, SUM(p.population) AS City_Population, t.total AS Total_Population FROM population p CROSS JOIN (SELECT SUM(population) AS total FROM population) t GROUP BY p.city, t.total;
CROSS JOIN会将分组后的每条记录与全表总计结果做笛卡尔积,让每条记录都带上总计值。
方法3:硬编码总计值(仅临时固定数据场景使用)
若确定全表人口总计不会变动,可直接写死数值,但此方式灵活性差,数据更新后需手动修改:
SELECT city, SUM(population) AS City_Population, 85 AS Total_Population FROM population GROUP BY city;
内容的提问来源于stack exchange,提问作者Codegator
相关产品推荐
相关产品推荐

