2014-02-28 59 views
0

我正在寫一個簡單的查詢,用於在Oracle數據庫中查找每個部門的工資貢獻。用於計算每個部門的工資貢獻的SQL

這裏是我的表:

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; 

這是計算我的輸出的有效方式還是有其他方法嗎?

回答

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的一個非常強大的組件,您應該瞭解它們。

+0

非常感謝Gordon,我還在學習查詢,請問我可以告訴我使用子查詢有什麼問題?我不知道分析函數,因此,如果您可以提供有關您發佈的查詢的一些詳細信息,並且如果可能的話,您可以請建議我可以在哪裏學習分析查詢,這會有所幫助。 – Chaitanya

+0

@ user2065083您可以在Oracle數據庫SQL語言參考中瞭解分析函數。 http://docs.oracle.com/cd/E11882_01/server.112/e26088/functions004.htm#SQLRF06174 –

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 
+0

謝謝TechDo,請你幫我理解你在這裏給出的查詢。 – Chaitanya

0

通過子句可以爲所有部門的總和計算一次,然後用它作爲參數。在您爲每個行計算的所有部門的示例總和值將導致性能損失。

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;