如何在SQL Server中基于已计算的总计计算薪资占比?
薪资占总计百分比的计算方案
嗨,我来帮你搞定这个计算问题!要算出每个薪资值对应总计的百分比,我们可以用两种简洁的方法来实现,下面给你详细说明:
方法一:用窗口函数(推荐)
窗口函数可以直接在原表中按员工分组,快速拿到对应总计值,写法高效又简洁:
SELECT empid, Salaryvalue, istotal, -- 计算百分比并保留1位小数 ROUND((Salaryvalue / MAX(CASE WHEN istotal = 1 THEN Salaryvalue END) OVER (PARTITION BY empid)) * 100, 1) AS percentage FROM work.temp ORDER BY empid, istotal;
代码拆解
MAX(CASE WHEN istotal = 1 THEN Salaryvalue END) OVER (PARTITION BY empid):这部分是核心!它会按empid分组,找出每组里标记为总计(istotal=1)的薪资值——因为每个员工只有一行总计,用MAX就能精准拿到这个分母值。ROUND(...,1):把计算出的百分比保留一位小数,和你想要的输出格式匹配。如果不想四舍五入,换成TRUNC((...) * 100,1)就可以得到类似16.6的结果。
方法二:子查询关联(适合不熟悉窗口函数的情况)
如果对窗口函数不太熟悉,用子查询先把每个员工的总计值查出来,再和原表关联计算也能达到目的:
SELECT t.empid, t.Salaryvalue, t.istotal, ROUND((t.Salaryvalue / total.total_salary) * 100, 1) AS percentage FROM work.temp t -- 子查询先取出所有员工的总计薪资 JOIN ( SELECT empid, Salaryvalue AS total_salary FROM work.temp WHERE istotal = 1 ) total ON t.empid = total.empid ORDER BY t.empid, t.istotal;
最终结果
不管用哪种方法,执行后都会得到符合预期的输出:
| empid | Salaryvalue | istotal | percentage |
|---|---|---|---|
| 1 | 10.0 | 0 | 16.7 |
| 1 | 20.0 | 0 | 33.3 |
| 1 | 30.0 | 0 | 50.0 |
| 1 | 60.0 | 1 | 100.0 |
内容的提问来源于stack exchange,提问作者user2726975
相关产品推荐
相关产品推荐

