用于计算每个部门的工资贡献的SQL

时间:2014-02-28 12:32:36

标签: sql oracle

我正在使用oracle数据库编写一个简单的查询,查找每个部门的工资贡献。

以下是我的表格:

CREATE TABLE employee (
  empid NUMBER,
  fname VARCHAR2(20),
  deptid NUMBER,
  salary NUMBER
);

CREATE TABLE department (
 deptid NUMBER,
 deptname VARCHAR2(20)
);

将数据插入此表:

INSERT INTO department VALUES (1, 'Sales');
INSERT INTO department VALUES (2, 'Accounting');

INSERT INTO employee VALUES (1,' John', 1,100);
INSERT INTO employee VALUES (2,' Lisa', 2,200);
INSERT INTO employee VALUES (3,' Jerry', 1,300);
INSERT INTO employee VALUES (4,' Sara', 1,400);

现在查看我在查询下面使用的每个部门的工资贡献百分比:

select dept.deptname, sum(emp.salary)/(select sum(emp.salary) from employee emp)*100 as percentge from employee emp, department dept where dept.deptid=emp.deptid group by dept.deptname;

这是计算我的输出的有效方法还是有其他方法?

3 个答案:

答案 0 :(得分:1)

您不需要子查询。您可以使用分析函数:

select dept.deptname,
       100*sum(emp.salary)/(sum(sum(emp.salary)) over ()) as percentage
from employee emp join
     department dept 
     on dept.deptid = emp.deptid 
group by dept.deptname;

我还更改了join语法以使用ANSI标准连接。

编辑:

使用子查询没有特定的“问题”。子查询确实有效。但是,一般而言,子查询比Oracle中的内置功能(在本例中为ANSI SQL)更难优化。在这个简单的例子中,我不知道是否存在性能差异。

对于分析函数,它们是SQL的一个非常强大的组件,您应该了解它们。

答案 1 :(得分:1)

请尝试:

select distinct a.*,
  (sum(Salary) over(partition by a.DeptID))/(sum(Salary) over())*100 "Percent"
from department a join employee b on a.deptid=b.deptid

答案 2 :(得分:0)

通过 with 子句,您可以计算所有部门的总和一次,然后将其用作参数。对于为每行计算的所有部门的示例总和值,这将导致性能损失。

    with t as
    (select sum(salary) as sum_salary from employee)

    select dept.deptname, sum(emp.salary)/ sum_salary * 100 as percentge 
    from employee emp, department dept, t 
    where dept.deptid=emp.deptid group by dept.deptname, sum_salary;