Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于计算每个部门的工资贡献的SQL_Sql_Oracle - Fatal编程技术网

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

用于计算每个部门的工资贡献的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

我正在使用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;

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

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

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,你能帮我理解你在这里提出的问题吗。