[07단원] 다중행 함수와 데이터 그룹화

2021. 9. 11. 13:11
728x90

 

교재명 : Do it! 오라클로 배우는 데이터베이스 입문 (이지스퍼블리싱 / 이지훈 지음)

 

[ Q1 ]

[ A1 ]

SELECT DEPTNO,
       TRUNC(AVG(SAL)) AS AVG_SAL,
       MAX(SAL) AS MAX_SAL,
       MIN(SAL) AS MIN_SAL,
       COUNT(*) AS CNT
  FROM EMP
GROUP BY DEPTNO;

[ Q2 ]

[ A2 ]

SELECT JOB,
       COUNT(*)
  FROM EMP
 GROUP BY JOB
HAVING COUNT(*) >= 3;

오답 풀이 (내가 쓴 답):

SELECT JOB, COUNT(*)
  FROM EMP
 WHERE COUNT(*) >= 3
 GROUP BY JOB

WHERE은 group by 보다 먼저 실행되므로 where 보다는 having절을 사용하는게 맞는 것 같다.

"같은 직종에 종사하는 사람이 3명 이상" 에서 직종 (job) 별로 그룹화를 먼저 시킨 다음 사람 수 조건을 붙인다는 것을 알 수 있다. 그래서 where을 사용하지 않고 group by를 사용한 것 같다.

 

[ Q3 ]

 

[ A3 ]

SELECT TO_CHAR(HIREDATE, 'YYYY') AS HIRE_YEAR,
       DEPTNO,
       COUNT(*) AS CNT
  FROM EMP
 GROUP BY TO_CHAR(HIREDATE, 'YYYY'), DEPTNO;

포인트는, HIREDATE 데이터를 문자열 타입(char)의 년도(year)만 가져오도록 가공하는 부분인 듯 하다.

 

[ Q4 ]

[ A4 ]

SELECT NVL2(COMM, 'O', 'X') AS EXIST_COMM,
       COUNT(*) AS CNT
  FROM EMP
 GROUP BY NVL2(COMM, 'O', 'X');

오답:

NVL2 함수 쓸 생각을 못함. 

NVL2(COMM, 'O', 'X') == 만약 COMM 데이터 값이 존재하면 O, NULL 또는 공백이면 X를 저장하도록 함

 

[ Q5 ]

[ A5 ]

SELECT DEPTNO,
       TO_CHAR(HIREDATE, 'YYYY') AS HIRE_YEAR,
       COUNT(*) AS CNT,
       MAX(SAL) AS MAX_SAL,
       SUM(SAL) AS SUM_SAL,
       AVG(SAL) AS AVG_SAL
  FROM EMP
 GROUP BY ROLLUP(DEPTNO, TO_CHAR(HIREDATE, 'YYYY'));

오답:

ROLLUP(DEPTNO, TO_CHAR(HIREDATE, 'YYYY')) == DEPTNO(부서) 기준으로 소계와 총계 구하기


 [ 참고자료 ] 

 

728x90

'SQL > Oracle SQL' 카테고리의 다른 글

[09단원] 서브쿼리  (0) 2021.09.13
[08단원] 조인(JOIN)  (0) 2021.09.13
[06단원] 데이터 처리와 가공  (0) 2021.08.30
[05단원] Where절과 연산자  (0) 2021.08.30

BELATED ARTICLES

more