SQL使用GROUP BY时如何同时统计各城市租金及所有城市总租金
解决方案
有两种常见的实现方式,优先推荐用ROLLUP扩展语法,无需重复查询表数据:
方案1:使用GROUP BY ... WITH ROLLUP(推荐)
这是SQL标准提供的分组聚合扩展功能,可以直接在分组统计的基础上生成合计行:
SELECT COALESCE(city_hometown, '所有城市总租金') AS city, SUM(rent) AS rent_generated_from_each_city FROM profiles AS p INNER JOIN tenancy_history AS t ON p.profile_id = t.profile_id GROUP BY city_hometown WITH ROLLUP;
- 说明:你原代码用的FULL JOIN会保留两边没有匹配的记录,如果仅需要统计有对应租户信息的租金,用INNER JOIN即可;如果需要统计无租金记录的城市(租金记0),换成LEFT JOIN即可,同步把
SUM(rent)改为SUM(IFNULL(rent,0))。 - 注意你原有代码中的表名写为tenancy_histories,和你给出的表定义tenancy_history不一致,执行前请核对实际表名调整。
方案2:使用UNION ALL拼接结果(兼容所有数据库版本)
如果你的数据库版本不支持ROLLUP语法,可以用UNION ALL把城市分组结果和总合计结果拼接起来:
-- 统计各城市租金 SELECT city_hometown AS city, SUM(rent) AS rent_generated_from_each_city FROM profiles AS p INNER JOIN tenancy_history AS t ON p.profile_id = t.profile_id GROUP BY city_hometown UNION ALL -- 统计所有城市总租金 SELECT '所有城市总租金' AS city, SUM(rent) AS rent_generated_from_each_city FROM tenancy_history;
内容的提问来源于stack exchange,提问作者Vidhit Shinde
相关产品推荐
相关产品推荐

