如何计算列中的百分比?

时间:2016-11-14 20:23:40

标签: sql oracle oracle11g

我有一个任务来计算各部门的最低薪水,以及从总薪水中算出多少百分比。 此外,我只能使用一个选择语句,可能我需要使用窗口函数。

这就是我的开始:

setter

但如果我使用RATIO_TO_REPORT函数,它会显示所有表,而不是按department_id分组。

1 个答案:

答案 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