我有一个任务来计算各部门的最低薪水,以及从总薪水中算出多少百分比。 此外,我只能使用一个选择语句,可能我需要使用窗口函数。
这就是我的开始:
setter
但如果我使用RATIO_TO_REPORT函数,它会显示所有表,而不是按department_id分组。
答案 0 :(得分:1)
听起来像
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)
,以使其超级明确,不打算或不需要分区。 / p>
该解决方案使用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