我正在使用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;
这是计算我的输出的有效方法还是有其他方法?
答案 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;