
COUNT, SUM, AVG, MAX, MIN 등기본구문
SELECT
DNAME,
JOB,
COUNT(*) "Total Empl",
SUM(SAL) "Total Sal"
FROM EMP,
DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY ROLLUP (DNAME, JOB);

GROUPING 함수
SELECT DNAME,
GROUPING(DNAME),
JOB,
GROUPING(JOB),
COUNT(*) "Total Empl",
SUM(SAL) "Total Sal"
FROM EMP,
DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY ROLLUP (DNAME, JOB)
ORDER BY DNAME, JOB;

ROLLUP과 CASE
SELECT
CASE GROUPING(DNAME) WHEN 1 THEN 'All Departments' ELSE DNAME END AS DNAME,
CASE GROUPING(JOB) WHEN 1 THEN 'All Jobs' ELSE JOB END AS JOB,
COUNT(*) "Total Empl",
SUM(SAL) "Total Sal"
FROM EMP,
DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY DNAME, ROLLUP(JOB);

SELECT
CASE GROUPING(DNAME) WHEN 1 THEN 'All Departments' ELSE DNAME END AS DNAME,
CASE GROUPING(JOB) WHEN 1 THEN 'All Jobs' ELSE JOB END AS JOB,
COUNT(*) "TotalEmpl",
SUM(SAL) "Total Sal"
FROM EMP,
DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY CUBE (DNAME, JOB);


SELECT
DNAME,
JOB,
MGR,
SUM(SAL) "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY GROUPING SETS ((DNAME, JOB, MGR), (DNAME, JOB), (JOB, MGR));

WINDOW FUNCTION 기본구조
SELECT WINDOW_FUNCTION(ARGUMENTS) OVER ([PARTITION BY 칼럼] [ORDER BY 절] [WINDOWING 절]) FROM 테이블 명;
- ARGUMENT : 함수에 따라 0~N개의 인수가 저장될 수 있음
- PARTITON BY : 전체 집함을 기준에 의해 소그룹으로 나눌 수 있음
- ORDER BY : 어떤 항목에 대해 순위를 지정할지 기술함
- WINDOWING : 함수 대상의 범위지정(SQL 서버 지원안함)
SELECT JOB,
ENAME,
SAL,
RANK() OVER (PARTITION BY JOB ORDER BY SAL DESC) JOB_RANK
FROM EMP;

SELECT
JOB,
ENAME,
SAL,
RANK() OVER (ORDER BY SAL DESC) RANK,
DENSE_RANK() OVER (ORDER BY SAL DESC) DENSE_RANK
FROM EMP;

SELECT
JOB,
ENAME,
SAL,
RANK() OVER (ORDER BY SAL DESC) RANK,
ROW_NUMBER() OVER (ORDER BY SAL DESC) ROW_NUMBER
FROM EMP;

SELECT
MGR,
ENAME,
SAL,
SUM(SAL) OVER (PARTITION BY MGR) MGR_SUM
FROM EMP;

SELECT
DEPTNO,
ENAME,
SAL,
FIRST_VALUE(ENAME) OVER
(PARTITION BY DEPTNO
ORDER BY SAL DESC
ROWS UNBOUNDED PRECEDING) DEPT_RICH
FROM EMP;
참고 - UNBOUNDED PRECEDING
PARTITION의 첫 번째 로우에서 윈도우가 시작합니다.
SELECT DEPTNO,
ENAME,
SAL,
LAST_VALUE(ENAME) OVER
(PARTITION BY DEPTNO ORDER BY SAL DESC
ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) DEPT_POOR
FROM EMP;
SELECT
ENAME,
HIREDATE,
SAL,
LAG(SAL, 2, 0) OVER (ORDER BY HIREDATE) PREV_SAL
FROM EMP
WHERE JOB = 'SALESMAN';

SELECT
ENAME,
HIREDATE,
LEAD(HIREDATE, 1) OVER (ORDER BY HIREDATE) "NEXTHIRED"
FROM EMP;
