用于计算每个部门的工资贡献的SQL
我正在使用oracle数据库编写一个简单的查询,查找每个部门的工资贡献 这是我的桌子:用于计算每个部门的工资贡献的SQL,sql,oracle,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
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;
这是计算我的输出的有效方法还是有其他方法?不需要子查询。您可以使用分析函数:
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非常强大的组件,您应该了解它们。请尝试:
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
通过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;
非常感谢Gordon,我还在学习查询,你能告诉我使用子查询的问题吗?我不知道分析函数,因此如果您能提供一些有关您发布的查询的详细信息,并且如果可能,请您建议我在哪里可以学习分析查询,这将非常有用。@user2065083您可以在《Oracle数据库SQL语言参考》中学习分析函数。谢谢TechDo,你能帮我理解你在这里提出的问题吗。