아래와 같은 데이터가 주어졌을 때, DEPTNO 별로 SAL 합계를 구해라.
흔히 실수 하는게 아래와 같이 쿼리를 날리면....
SELECT DEPTNO, SUM(SAL) FROM EMP;
에러가 발생한다.
SQL Error [937] [42000]: ORA-00937: 단일 그룹의 그룹 함수가 아닙니다.
정답은
SELECT DEPTNO, SUM(SAL) FROM EMP GROUP BY DEPTNO;
GROUP BY 에 나오는 컬럼과 SELECT 이후에 나오는 컬럼을 맞춰주는 습관을 들이자.
오류를 방지하고, 또한 가독성을 높이기 때문이다.
SQL 쿼리가 실행되는 순서.
FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY
ADVANCED )
1. 부서별, 직무별 직원수를 구해보시요.
SELECT DEPTNO, JOB, COUNT(*) FROM EMP GROUP BY DEPTNO, JOB ORDER BY DEPTNO;
2. 부서별 사원수가 5보다 적은것은?
SELECT DEPTNO, COUNT(*) CNT FROM EMP GROUP BY DEPTNO HAVING COUNT(*) < 5;
주의) WHERE 를 사용하려고 할 수도 있는데, SQL 쿼리가 실행되는 순서를 생각해보면, WHERE 를 사용하면 안된다.
3. 부서별 평균 급여가 2000 이상인 부서는?
SELECT DEPTNO, ROUND(AVG(SAL)) FROM EMP GROUP BY DEPTNO HAVING AVG(SAL) >= 2000;
4. 1981년도 입사한 사원들의 DEPTNO, JOB 별 급여 합계가 5000 이상인 DEPTNO, JOB을 급여 합계가 많은 순으로 출력하시오.
SELECT DEPTNO, JOB, sum(sal) sum FROM EMP
-- WHERE TO_CHAR(HIREDATE, 'YY') = '81';
-- DATE 형은 위에처럼 스트링으로 사용하던가,
-- 아래처럼 사용해서 DATE 형이 인덱스가 걸린경우, 인덱스를 사용하도록 하는게 좋다.
WHERE HIREDATE BETWEEN TO_DATE('19810101', 'yyyymmdd') AND TO_DATE('19811231', 'yyyymmdd')
GROUP BY DEPTNO, JOB
HAVING sum(sal) >= 5000
ORDER BY sum DESC;
부서별로 뽑고, 추가로 전체의 합을 보고 싶다면....
SELECT DEPTNO, SUM(SAL) FROM EMP GROUP BY ROLLUP(DEPTNO)
만약 ROLLUP 을 사용하지 않는다면, UNION 을 사용하고, 컬럼의 갯수를 맞추기 위해서 DEPTNO자리에 NULL을 사용해야 함.
SELECT DEPTNO, SUM(SAL) FROM EMP GROUP BY DEPTNO
UNION
SELECT NULL, SUM(SAL) FROM EMP;
부서별 업무별 합과 전체 합을 구하시요.
SELECT DEPTNO, JOB, SUM(SAL) FROM EMP GROUP BY ROLLUP(DEPTNO, JOB);
이걸 ROLLUP 을 사용하지 않는다면
SELECT DEPTNO, JOB, SUM(SAL) FROM EMP GROUP BY DEPTNO, JOB
UNION ALL
SELECT DEPTNO, NULL, SUM(SAL) FROM EMP GROUP BY DEPTNO
UNION ALL
SELECT NULL DEPTNO, '' JOB, SUM(SAL) FROM EMP ORDER BY DEPTNO, 2;
주의)
1. ORDER BY 절은 맨 마지막에 문장에 넣는다.
2. 컬럼 갯수가 맞지 않을때는 빈 컬럼 부분에 NULL을 사용한다.
3. 위에서 맨 마지막에 2 라고하는 컬럼 순서 번호에 JOB 이라고 쓰면 에러가 안날수도 있고, 날수도 있다.???
'DB > ORACLE' 카테고리의 다른 글
DBeaver 실행 계획, 쿼리 수행 시간 확인 (0) | 2022.12.21 |
---|---|
UNION 과 UNION ALL (0) | 2022.12.21 |
Dbeaver 설정 (0) | 2022.12.21 |
집계 함수...null 을 빼고 계산한다. (0) | 2022.12.21 |
RECORD (0) | 2022.12.20 |
댓글