Database/OracleSQL

오라클 소계값, 총계값, ROLLUP

Jaybon 2020. 3. 26. 11:59

 

월급과 보너스를 합하기

원본

SELECT *
FROM EMP;

 

 

SELECT ENAME, JOB, SAL+DECODE(COMM, null, 0, COMM)
FROM EMP;

 

 

소계값, 총계값을 UNION ALL 로 만들기

SELECT ENAME, JOB, DEPTNO, TO_CHAR(S,'$999,999')
FROM
(
SELECT ENAME, JOB, SAL+DECODE(COMM, null, 0, COMM) "S", DEPTNO
FROM EMP
ORDER BY DEPTNO
)
WHERE DEPTNO = 10

UNION ALL

-- 유니온 올 하려면 타입을 같게 맟춰야한다 TO_CHAR까지...
SELECT '소계', NULL, NULL, TO_CHAR(SUM(SAL), '$999,999') "SUM"
FROM EMP
WHERE DEPTNO = 10

UNION ALL

SELECT ENAME, JOB, DEPTNO, TO_CHAR(S,'$999,999')
FROM
(
SELECT ENAME, JOB, SAL+DECODE(COMM, null, 0, COMM) "S", DEPTNO
FROM EMP
ORDER BY DEPTNO
)
WHERE DEPTNO = 20

UNION ALL

SELECT '소계', NULL, NULL, TO_CHAR(SUM(SAL), '$999,999') "SUM"
FROM EMP
WHERE DEPTNO = 20

UNION ALL

SELECT ENAME, JOB, DEPTNO, TO_CHAR(S,'$999,999')
FROM
(
SELECT ENAME, JOB, SAL+DECODE(COMM, null, 0, COMM) "S", DEPTNO
FROM EMP
ORDER BY DEPTNO
)
WHERE DEPTNO = 30

UNION ALL

SELECT '소계', NULL, NULL, TO_CHAR(SUM(SAL), '$999,999') "SUM"
FROM EMP
WHERE DEPTNO = 30

UNION ALL

SELECT '총계', NULL, NULL, TO_CHAR(SUM(SAL), '$999,999') "SUM"
FROM EMP;

 

 

SELECT DEPTNO, NULL JOB, ROUND(AVG(SAL),1) AVG_SAL, COUNT(*) CNT_EMP
FROM EMP
GROUP BY DEPTNO

UNION ALL

SELECT DEPTNO, JOB, ROUND(AVG(SAL),1) AVG_SAL, COUNT(*) CNT_EMP
FROM EMP
GROUP BY DEPTNO, JOB

UNION ALL

SELECT NULL DEPTNO, NULL JOB, ROUND(AVG(SAL),1) AVG_SAL, COUNT(*) CNT_EMP
FROM EMP
ORDER BY DEPTNO, JOB;

 

소계값, 총계값을 ROLLUP으로 구하기

SELECT DEPTNO, JOB, ROUND(AVG(SAL), 1) AVG_SAL, COUNT(*) CNT_EMP
FROM EMP
GROUP BY ROLLUP (DEPTNO, JOB);

 

 

--학생 테이블의 키의 평균을 구하시오.
SELECT AVG(HEIGHT)
FROM STUDENT;

 

 

--학생 테이블에서 DEPTNO1 별 학생들의 키의 평균을 구하시오. 
SELECT DEPTNO1, AVG(HEIGHT)
FROM STUDENT
GROUP BY DEPTNO1;

 

 

--학생 테이블에서 DEPTNO1별 학생들의  키의 평균과 소계값을 구하시오.
SELECT DEPTNO1, GRADE, ROUND(AVG(HEIGHT), 1) , COUNT(*)
FROM STUDENT
GROUP BY ROLLUP (DEPTNO1, GRADE);

 

 

-- 직업별 급여합계 조회 마지막줄에 총합계 추가해서 표시
SELECT JOB, SUM(SAL)
FROM EMP
GROUP BY ROLLUP (JOB);

 

 

--PANMAE 테이블에서 날짜별(P_DATE) 상품이(P_CODE) 몇개(P_QTY) 판매 되었는지와 소계값을 구하시오
SELECT P_DATE, P_CODE, SUM(P_QTY)
FROM PANMAE
GROUP BY ROLLUP (P_DATE, P_CODE);

 

 

--PANMAE 테이블에서 상품별(P_CODE)로 날짜마다(P_DATE) 얼마의 금액(P_TOTAL)이 판매 되었는지와 소계값을 구하시오
SELECT P_CODE, P_DATE, SUM(P_TOTAL)
FROM PANMAE
GROUP BY ROLLUP (P_CODE, P_DATE);