SQL Server如何在分组后为每个城市添加单独薪资总计行?
实现每个城市分组下添加薪资总计行的方法
嘿,这个需求很常见,咱们可以用SQL里的ROLLUP子句或者UNION ALL拼接的方式来实现,两种方法各有适用场景,我给你详细说说:
方法一:用ROLLUP生成自动小计(推荐)
ROLLUP是分组查询的扩展功能,能自动生成指定层级的小计行,完美匹配你要在每个城市下加总计的需求。具体写法如下:
SELECT CASE WHEN name IS NULL THEN '城市总计' ELSE name END AS name, city, SUM(salary) AS total_salary FROM Employee GROUP BY city, name WITH ROLLUP HAVING city IS NOT NULL;
关键部分解释:
GROUP BY city, name WITH ROLLUP:先按city分组,再按name分组,ROLLUP会自动生成每个城市下的薪资小计行(也就是该城市所有员工的薪资总和)。CASE语句:当name为NULL时,说明这一行是ROLLUP生成的城市总计行,我们把它显示为“城市总计”,否则显示原员工姓名。HAVING city IS NOT NULL:过滤掉最后可能出现的全表总计行(如果不需要全表级别的总计,加上这个条件就只会保留每个城市的分组和对应总计行)。
方法二:用UNION ALL拼接结果(兼容更多数据库)
如果你的数据库不支持ROLLUP(比如一些轻量型数据库),可以用UNION ALL把原分组数据和城市总计数据拼接起来,再排序确保总计行在对应城市的下方:
-- 第一步:查询每个姓名+城市的薪资总和 SELECT name, city, SUM(salary) AS total_salary FROM Employee GROUP BY name, city UNION ALL -- 第二步:查询每个城市的薪资总计 SELECT '城市总计' AS name, city, SUM(salary) AS total_salary FROM Employee GROUP BY city -- 排序确保每个城市的总计行排在最后 ORDER BY city, CASE WHEN name = '城市总计' THEN 1 ELSE 0 END;
示例结果参考
假设你的Employee表有如下数据:
| name | city | salary |
|---|---|---|
| 张三 | 北京 | 8000 |
| 李四 | 北京 | 9000 |
| 王五 | 上海 | 10000 |
| 赵六 | 上海 | 11000 |
执行上述任意一种SQL后,都会得到类似这样的结果:
| name | city | total_salary |
|---|---|---|
| 张三 | 北京 | 8000 |
| 李四 | 北京 | 9000 |
| 城市总计 | 北京 | 17000 |
| 王五 | 上海 | 10000 |
| 赵六 | 上海 | 11000 |
| 城市总计 | 上海 | 21000 |
内容的提问来源于stack exchange,提问作者heyNow
相关产品推荐
相关产品推荐

