oracle 正在获取部门内员工薪金的百分比

u59ebvdq  于 2022-12-03  发布在  Oracle
关注(0)|答案(3)|浏览(182)

我需要使用分析函数创建一个报表,该报表以百分比形式显示每个雇员在其工作的部门中所获得的薪金部分的信息。

SELECT EMPLOYEES.FIRST_NAME, EMPLOYEES.LAST_NAME, EMPLOYEES.DEPARTMENT_ID, 
DEPARTMENTS.DEPARTMENT_NAME, EMPLOYEES.SALARY,
(SALARY/SUM(SALARY)) * 100  over (partition by DEPARTMENT_ID) AS "PercentWithinDepartment"
FROM HR.EMPLOYEES
FULL JOIN HR.DEPARTMENTS ON EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID

我收到“ORA-00923 FROM关键字未在预期位置找到”错误,但我认为这不是我在此任务中的唯一错误。
我无法提供数据库的代码片段,但可以针对HR示例模式运行。

我的请求是帮助我找出错误来正确地完成这项任务。

flmtquvp

flmtquvp1#

直接的问题是over子句的位置不对:

(SALARY/SUM(SALARY)) * 100  over (partition by DEPARTMENT_ID)

应该是

(SALARY/SUM(SALARY) over (partition by DEPARTMENT_ID)) * 100

但是,对DEPARTMENT_ID的引用是不明确的,因为该列在两个表中,所以它应该是:

(SALARY/SUM(EMPLOYEES.SALARY) over (partition by DEPARTMENTS.DEPARTMENT_ID)) * 100

您可能需要考虑使用表别名以使代码更短。
您可能还希望将百分比四舍五入(或截断/下限)到小数点后一位或两位。
我不确定您是否真的想要完整的外部链接,因为完整的外部链接会包含所有没有员工的部门(例如,“Recruiting”)。左外部链接看起来更适合,所以未链接至任何部门的“金伯利Grant”仍会包含在内。
我必须计算员工在所有组织中获得的工资的百分比,我很困惑为什么我在这里得到“不是单组组函数”错误
因为您添加为注解的版本具有:

SALARY/SUM(EMPLOYEES.SALARY)*100

这是函数的聚合形式,而不是分析形式。由于您不希望在此处进行聚合,因此仍然需要一个over子句来使其成为分析形式,但该子句可以为空:

SALARY/SUM(EMPLOYEES.SALARY) over () * 100

当然,您也可以同时执行这两项操作:

select employees.first_name,
  employees.last_name,
  employees.department_id, 
  departments.department_name,
  employees.salary,
  salary / sum(employees.salary) over (partition by departments.department_id) * 100 as "PercentWithinDepartment",
  salary / sum(employees.salary) over () * 100  as "PercentWithinOrganization"
from hr.employees
left join hr.departments on employees.department_id = departments.department_id;

FIRST_NAME           LAST_NAME                 DEPARTMENT_ID DEPARTMENT_NAME                    SALARY PercentWithinDepartment PercentWithinOrganization
-------------------- ------------------------- ------------- ------------------------------ ---------- ----------------------- -------------------------
Jennifer             Whalen                               10 Administration                       4400                     100                .636389933
Michael              Hartstein                            20 Marketing                           13000              68.4210526                1.88024299
Pat                  Fay                                  20 Marketing                            6000              31.5789474                .867804455
...
Kimberely            Grant                                                                        7000                     100                1.01243853

您可能还需要添加order by子句...

n8ghc7c1

n8ghc7c12#

我没有HR模式(但我有Scott),所以--我使用SQL*Plus的格式化功能使它看起来更漂亮。

SQL> set numformat 999g990d00
SQL> break on deptno on dname
SQL> compute sum of pct_sal on deptno
SQL>
SQL> select e.deptno, d.dname, e.ename, e.sal,
  2    sum(e.sal) over (partition by e.deptno) dept_sal,
  3    --
  4    round((e.sal / sum(e.sal) over (partition by e.deptno)) * 100, 2) pct_sal
  5  from emp e join dept d on d.deptno = e.deptno
  6  order by e.deptno, e.ename;

结果:

DEPTNO DNAME          ENAME              SAL    DEPT_SAL     PCT_SAL
----------- -------------- ---------- ----------- ----------- -----------
      10,00 ACCOUNTING     CLARK         2.450,00    8.750,00       28,00
                           KING          5.000,00    8.750,00       57,14
                           MILLER        1.300,00    8.750,00       14,86
*********** **************                                    -----------
sum                                                                100,00
      20,00 RESEARCH       ADAMS         1.100,00   10.915,00       10,08
                           FORD          3.000,00   10.915,00       27,49
                           JONES         2.975,00   10.915,00       27,26
                           SCOTT         3.000,00   10.915,00       27,49
                           SMITH           840,00   10.915,00        7,70
*********** **************                                    -----------
sum                                                                100,02
      30,00 SALES          ALLEN         1.600,00    9.400,00       17,02
                           BLAKE         2.850,00    9.400,00       30,32
                           JAMES           950,00    9.400,00       10,11
                           MARTIN        1.250,00    9.400,00       13,30
                           TURNER        1.500,00    9.400,00       15,96
                           WARD          1.250,00    9.400,00       13,30
*********** **************                                    -----------
sum                                                                100,01

14 rows selected.

SQL>

(Sum由于四舍五入的原因,并不完全是100%。)

oknwwptz

oknwwptz3#

我可能弄错了,但在我看来,您所需要的只是使用ratio_to_report分析函数。请尝试使用此函数

SELECT E.FIRST_NAME, E.LAST_NAME, E.DEPARTMENT_ID, 
       D.DEPARTMENT_NAME, E.SALARY,
       100 * ratio_to_report(e.salary) over (partition by   d.department_id)
  FROM HR.EMPLOYEES e
  JOIN hr.departments d 
    on e.department_id = d.department_id
 order by d.department_id;

相关问题