2011-09-11 4 views
2

oracle sql에 대한 도움이 필요합니다. 문제 : 직원과 부서가 2 테이블 있습니다. 나는 하나의 쿼리에서 평균 부서 급여를 받았는데, 얼마나 많은 직원이 자신의 부서 평균보다 더 많은 돈을 벌어들이는지보고 싶습니다. 나는 이것을 지금까지 가지고있다.단일 행 하위 쿼리가 둘 이상의 행을 반환합니다.

select ROUND(AVG(Salary), 2) Dept_avg_sal 
from employee, department 
where department.department_id = employee.department_id 
group by department_name 

내가 뭘하려고 오전입니다 :

select employee_name, 
     salary, 
     d.department_name 
from employee e, 
     department d 
where salary > (select ROUND(AVG(Salary), 2) Dept_avg_sal 
       from employee, 
         department 
       where department.department_id = employee.department_id 
       group by department_name) 

입니다 점점 ​​메신저 오류 : 01427

이 쿼리는 부서의 평균을 반환합니다. 00000 - "단일 행 하위 쿼리는 둘 이상의 행을 반환합니다"

동일한 부서의 2 명의 직원이 평균보다 많은 돈을 벌었다는 것을 알고 있습니다. 이것이 문제의 원인이라고 생각합니다.

EMPLOYEE_NAME  - SALARY -    -DEPARTMENT_NAME-  DEPT_AVG_SAL   
-------------------- ---------------------- -------------------- ------------ 
FISHER    - 3000.00 -    SALES  -   2500.00     
JONES   -  3000.00    - ACCOUNTING   - 2750.00     
KING    - 5000.00   -  EXECUTIVE  -  4500.00     
**SCOTT   -  2500.00   -  IT    -  2100.00     
SMITH   -  2900.00   -  IT  -    2100.00**     
WILSON   - 3000.00   -  RESEARCH  -  2633.33 

모든 도움을 주시면 감사하겠습니다.

+0

왜이 'MySQL' 태그를 붙였습니까? 오라클과 MySQL 모두에서 작동하는 대답이 필요합니까? –

답변

7

초기 쿼리에 외부 쿼리에 대한 조인 조건과 관심있는 부서에 대한 행으로 만 제한되는 내부 쿼리의 조 건 조건이 누락되었습니다. 또한 일반적으로 id이 기본 키인 group by name을 원하지 않습니다. 당신의 상관 하위 쿼리를 해결하기 위해 이러한 문제를 해결

SELECT e.employee_name, 
     e.salary, 
     d.department_name 
FROM employee e 
     JOIN department d 
     ON d.department_id = e.department_id 
WHERE e.salary > (SELECT ROUND(AVG(Salary), 2) Dept_avg_sal 
        FROM employee e2 
        WHERE e2.department_id = e.department_id) 

을 제공하지만 당신은 스칼라 하위 쿼리 상관 죽겠다 및 파생 테이블이 더 잘 작동으로 교체 찾을 수 있습니다.
SELECT e.employee_name, 
     e.salary, 
     d.department_name 
FROM employee e 
     JOIN department d 
     ON d.department_id = e.department_id 
     JOIN (SELECT ROUND(AVG(Salary), 2) Dept_avg_sal, 
        department_id 
      FROM employee 
      GROUP BY department_id) e2 
     ON e2.department_id = e.department_id 
      AND e.salary > e2.Dept_avg_sal 

는 Oracle의 경우 다음 또한 내가

SELECT employee_name, 
     salary, 
     d.department_name 
FROM (SELECT employee_name, 
       salary, 
       d.department_name, 
       AVG(Salary) OVER (PARTITION BY e.department_id) AS AvgSalary 
     FROM employee e 
       JOIN department d 
       ON d.department_id = e.department_id) 
WHERE salary > AvgSalary 
+0

마지막 부분이 작동했습니다. – Geo

1

(가)> 연산자 따라서 귀하의 내부 SELECT 정확히 1 행을 리턴하는 단 하나 개의 값을 받아 믿고 작동합니다. 내 생각 엔 당신이 여러 행을 얻는다는 것입니다. 어떤 내면의 SELECT 반환을보고 난 당신이 (안 테스트) 서브 쿼리에 추가 d.department_id = department.department_id 조건을 넣어해야한다고 생각 LIMIT 1.

1

을 시도 : 그냥 쓰기

select employee_name, 
     salary, 
     d.department_name 
from employee e, 
     department d 
where salary > (select ROUND(AVG(Salary), 2) Dept_avg_sal 
       from employee, 
         department 
       where department.department_id = employee.department_id 
       AND d.department_id = department.department_id 
       group by department_name) 

또는 :

select e.employee_name, 
     e.salary, 
     d.department_name 
from employee e, 
     department d 
where e.department_id = d.department_id 
     AND salary > (select ROUND(AVG(Salary), 2) Dept_avg_sal 
       from employee 
       where e.department_id = employee.department_id) 
관련 문제