2014-02-28 2 views
0

각 부서의 급여 기여도를 찾는 Oracle 데이터베이스를 사용하여 간단한 쿼리를 작성합니다.각 부서의 급여 기여도를 계산하기위한 SQL

: 이제
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); 

내가 쿼리 아래 사용하고 각 부서에 의해 비율의 급여 공헌을 찾을 :이 테이블에 데이터를 삽입

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

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

: 여기

내 테이블입니다
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; 

는 또한 ANSI 표준 조인 사용하는 join 구문을 변경했습니다.

편집 :

이에 대한 하위 쿼리를 사용과 특정 "문제"가 아니다. 하위 쿼리가 작동합니다. 그러나 일반적으로 하위 쿼리는 Oracle의 기본 제공 기능 (이 경우 ANSI SQL)보다 최적화하기가 더 어렵습니다. 이 간단한 경우에는 성능 차이가 있는지 여부를 알 수 없습니다.

분석 기능은 SQL의 매우 강력한 구성 요소이며 이에 대해 알아야합니다.

+0

고든 고마워, 나는 여전히 쿼리를 배우고있다, 부탁을 사용하여 문제가 무엇인지 말해 줄 수 있습니까? 분석 함수를 인식하지 못하기 때문에 게시 된 쿼리에 대한 세부 정보를 제공하고 가능한 경우 분석 쿼리를 어디서 배울 수 있는지 제안 할 수 있다면 도움이 될 것입니다. – Chaitanya

+0

@ user2065083 Oracle Database SQL Language Reference에서 분석 함수에 대해 학습 할 수 있습니다. 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; 
관련 문제