[SQL퀴즈] not a single-group group function 해결, group by사용, outer join사용

문제

employees 테이블과 departments 테이블로부터 각 부서에 대한 부서번호(department_id), 부서이
름(department_name), 위치(location_id) 및 사원(employee_id) 수를 보여주는 쿼리구문을 작성하시오.
단, 사원이 없는 부서도 출력을 시키시오.

두 테이블 구조는 아래와 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$> desc employees;

이름 널? 유형
-------------- -------- ------------
EMPLOYEE_ID NOT NULL NUMBER(6)
FIRST_NAME VARCHAR2(20)
LAST_NAME NOT NULL VARCHAR2(25)
EMAIL NOT NULL VARCHAR2(25)
PHONE_NUMBER VARCHAR2(20)
HIRE_DATE NOT NULL DATE
JOB_ID NOT NULL VARCHAR2(10)
SALARY NUMBER(8,2)
COMMISSION_PCT NUMBER(2,2)
MANAGER_ID NUMBER(6)
DEPARTMENT_ID NUMBER(4)
1
2
3
4
5
6
7
8
$> desc departments;

이름 널? 유형
--------------- -------- ------------
DEPARTMENT_ID NOT NULL NUMBER(4)
DEPARTMENT_NAME NOT NULL VARCHAR2(30)
MANAGER_ID NUMBER(6)
LOCATION_ID NUMBER(4)




내쿼리

1
2
3
4
5
6
7
8
select e.department_id, d.department_name, d.location_id, count(e.employee_id)
from employees e
join departments d
on d.department_id = e.department_id;

//출력값
ORA-00937: 단일 그룹의 그룹 함수가 아닙니다
00937 00000 - "not a single-group group function"




강사님코드

1
2
3
4
5
SELECT d.department_id, d.department_name, d.location_id, COUNT(e.employee_id)
FROM employees e
RIGHT OUTER JOIN departments d
ON e.department_id = d.department_id
GROUP BY d.department_id, d.department_name, d.location_id;




배운 지식

첫번째

  • join할때 내 코드는 inner join으로 조인조건을 만족하는 행만 반환한다
    • 반면 outer join은 조인조건을 만족하는 행과 조인조건을 만족하지않는 행을 모두 반환하기때문에 문제에서 제시했던 단, 사원이 없는 부서도 출력을 시키시오.까지 만족시킬 수 있다.
    • 따라서 outer join을 사용해야한다.

두번째

  • not a single-group group function 의미는 해당 SQL쿼리문에 특정 열이 GROUP BY구에서 참조되지 않으면 그 열과 Group function를 포함할 수 없으므로 group by를 넣어야한다.
  • Group by절
    • Group by절은 count하는 열빼고 다 작성해야한다.