Cube
SELECT model, year, color, sum(amount)
FROM sales
GROUP BY CUBE(mode, year, color);Rollup
SELECT job, deptno, sum(sal)
FROM emp
GROUP BY ROLLUP(deptno,job);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, NULL, sum(sal)
FROM empGrouping Function
칼럼이나 테이블에 간단한 이름을 부여해 가독성 높임
SELECT deptno, job, sum(sal), grouping(job) as T1
FROM emp
GROUP BY cube(deptno, job);
특정 조건에 따라 값을 변환할 때 사용
SELECT decode(grouping(deptno),0,to_char(deptno), 'ALL') as deptno,
decode(grouping(job),0,job, 'ALL') as job,
sum(sal)
FROM emp
GROUP BY cube(deptno, job)
null이 실제 데이터인지, 집계 결과로 추가된 값인지 구분
0 → 실제 값, 1 → 생략된 집계
SELECT deptno,job, sum(sal), grouping_id(deptno, job) as GRP_ID
FROM emp
GROUP BY CUBE(deptno, job);
Pivoting
SELECT *
FROM (SalesTable PIVOT (Sales for Month IN
(‘Jan’,’Feb’,’Mar’))
Un-pivoting
SELECT *
FROM (SalesReport UNPIVOT (Sales for Month IN
(‘Jan’,’Feb’,’Mar’))
SELECT EMPNO, ENAME, SAL, RANK() OVER (ORDER BY SAL DESC) AS RANK FROM EMP
SELECT DEPTNO, EMPNO, ENAME, SAL,
RANK() OVER(PARTITION BY DEPTNO ORDER BY SAL DESC)
AS DEPT_RANK FROM EMP ORDER BY DEPTNO
SELECT EMPNO, ENAME, SAL,
RANK() OVER(ORDER BY SAL DESC) AS RANK,
DENSE_RANK() OVER(ORDER BY SAL DESC) AS DENSE_RANK,
ROW_NUMBER() OVER(ORDER BY SAL DESC) AS ROW_NUMBER
FROM EMP;
RANK, DENSE_RANK, ROW_NUMBER로 비교SELECT DEPTNO, EMPNO, ENAME, SAL,
RANK() OVER(PARTITION BY DEPTNO ORDER BY SAL DESC) AS DEPT_RANK FROM EMP
SELECT DEPTNO, JOB, EMPNO, ENAME, SAL,
RANK() OVER(PARTITION BY DEPTNO, JOB ORDER BY SAL DESC) AS DEPT_RANK FROM EMP;
SELECT DEPTNO, EMPNO, ENAME, SAL,
ROUND(AVG(SAL) OVER(PARTITION BY DEPTNO) DEPTNO)) AS SAL
ROUND(AVG(SAL) OVER(PARTITION BY DEPTNO) DEPTNO)) AS DIFF FROM EMP
SELECT EMPNO, ENAME, SAL,
NTILE(2) OVER(ORDER BY SAL DESC) AS NTILE2,
NTILE(4) OVER(ORDER BY SAL DESC) AS NTILE4
NTILE(10) OVER(ORDER BY SAL DESC) AS NTILE10 FROM EMP;
SELECT EMPNO, ENAME, SAL,
SUM(SAL) OVER(ORDER BY EMPNO ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS ACC_SAL
FROM EMP
UNBOUNDED PRECEDING: 첫 번째 행부터 시작합니다.CURRENT ROW: 현재 행까지를 포함SELECT EMPNO, ENAME, SAL,
SUM(SAL) OVER(ORDER BY EMPNO ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) ACC_SAL
FROM EMP
SELECT EMPNO, ENAME, SAL,
SUM(SAL) OVER(ORDER BY EMPNO RANGE BETWEEN 100 PRECEDING AND 200 FOLLOWING) AS ACC_SAL
FROM EMP
SELECT DEPTNO, EMPNO, ENAME, SAL,
SUM(SAL) OVER(PARTITION BY DEPTNO ORDER BY EMPNO ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS ACC_SAL
FROM EMP;
PARTITION BY DEPTNO), 각 부서에서 직원 번호 기준으로 이전 1행과 다음 1행을 포함한 급여 합계를 계산SELECT EMPNO, ENAME, SAL,
LAG(SAL) OVER (ORDER BY EMPNO) AS LAG1,
LEAD(SAL) OVER (ORDER BY EMPNO) AS LEAD1,
LAG(SAL,3) OVER (ORDER BY EMPNO) AS LAG3,
LEAD(SAL,3) OVER (ORDER BY EMPNO) AS LEAD3
FROM EMP;
LAG(SAL)은 이전 행의 값을 가져오며, LEAD(SAL)은 다음 행의 값을 가져옴LAG(SAL,3)와 LEAD(SAL,3)은 현재 행 기준으로 3행 전과 후의 값을 가져옴SELECT empno, ename, job, mgr FROM emp
START WITH empno = 7698
CONNECT BY PRIOR mgr = empno;
SELECT empno, ename, job, mgr FROM emp
START WITH empno = 7698
CONNECT BY empno = PRIOR mgr;
SELECT ename ||' reports to ' || PRIOR ename "Walk" FROM emp
START WITH ename = 'KING'
CONNECT BY PRIOR empno = mgr
SELECT LPAD (' ', 3 * LEVEL-3)|| ename AS org_chart, LEVEL , empno , mgr , deptno FROM emp
START WITH mgr IS NULL CONNECT BY PRIOR empno = mgr