听起来像
select min(salary) as min_salary, round( min(salary)/sum(salary) * 100 , 1 ) as percent
from employees
group by department_id
;
如果您还需要每个部门中薪水最低的员工的姓名(假设始终只有一个),则添加
, min(empl_name) keep (dense_rank first order by salary) as min_sal_empl_name
到SELECT 声明。如果可以有最低工资的关系,并且您需要所有员工,请这样说 - 在这种情况下,您可能需要您猜到的分析函数。比如:
select empl_name, salary, round(salary/tot_sal*100, 1) as percent
from ( select empl_name, salary,
sum(salary) over (partition by department_id) as tot_sal,
rank() over (partition by department_id order by salary) as rn
from employees
)
where rn = 1
;
添加:OP 表示他们毕竟需要薪水占总薪水的百分比(跨所有部门)。这可以通过将ratio_to_report() 与空窗口条件(没有任何“分区”)与rank() 按部门分区来获得每个部门的最低工资来完成。
如果您不喜欢 over () 中的 ratio_to_report() 中的窗口子句,也可以将其写为 over (partition by null) 以使其超级明确,无需或不需要分区。
该解决方案使用 SCOTT 架构中的 EMP 表进行测试,因为原始帖子不包含示例数据。
select deptno, empno, ename, sal, percent
from (
select empno, ename, sal, deptno,
round(100 * ratio_to_report(sal) over (), 1) as percent,
rank() over (partition by deptno order by sal) as rn
from scott.emp
)
where rn = 1
;
DEPTNO EMPNO ENAME SAL PERCENT
------ ----- ------ ---- -------
10 7934 MILLER 1300 4.5
20 7369 SMITH 800 2.8
30 7900 JAMES 950 3.3