You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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表有如下数据:

namecitysalary
张三北京8000
李四北京9000
王五上海10000
赵六上海11000

执行上述任意一种SQL后,都会得到类似这样的结果:

namecitytotal_salary
张三北京8000
李四北京9000
城市总计北京17000
王五上海10000
赵六上海11000
城市总计上海21000

内容的提问来源于stack exchange,提问作者heyNow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:27:29