🔽 ROLL UP
🔽 GROUP BY ROLLUP(A, B, C) 예시
🔽 GROUP BY A, ROLLUP((B, C)) 예시
🔽 GROUPING, GROUPING_ID 그리고 숫자 GROUP 추가에 대한 내용
GROUPING 함수
: GROUPING 함수는 ROLLUP이랑 같이 사용합니다.
해당 칼럼이 ROLLUP 되었을 때 그룹에서 빠져있다면 1을 반환합니다.
즉, GROUP BY ROLLUP 결과로 NULL이 나왔을 때 1을 반환합나다.
OVER () : SELECT 명령 수행 결과 전체를 분석 대상으로 합니다.
Window Function 범위 지정 (ROW, RANGE 차이 분석)
윈도우함수(args) OVER (
[ PARTITION BY column ] ORDER BY column [ASC | DESC] ]
[ [ROWS|RANGE] BETWEEN UNBOUNDED PRECEDING[CURRENT ROW]
AND UNBOUNDED FOLLOWING[CURRENT ROW] ]
)
윈도우 함수로 사용 되는 파라미터(args)는 함수마다 다르며 0~N개가 지정될 수 있습니다.
OVER 괄호 안의 내용은 전부 생략 가능한 내용입니다.
하나씩 살펴보면 PARTIONTION BY 는 입력한 컬럼별로 프레임을 나누고, 나눠진 프레임별로 윈도우 함수를 적용합니다.
GROUP BY 절을 이용해 컬럼별로 묶는 것과 같다고 생각하시면 됩니다.
어떤 함수를 적용하기전 정렬이 필요하다면 ORDER BY 절을 이용하면 됩니다.
ROWS : 물리적인 단위로 행 집합을 지정
RANGE : 논리적인 단위로 의해 행 집합을 지정
BETWEEN ~ AND : 윈도우의 시작과 끝 위치를 지정
UNBOUNDED PRECEDING : 윈도우 시작 위치가 첫 번째 로우임을 의미
UNBOUNDED FOLLOWING : 윈도우 마지막 위치가 마지막 로우임을 의미
[ROW수] PRECEDING : 윈도우 시작 위치가 ROW수만큼 이전이 시작 로우임을 의미
[ROW수] FOLLOWING : 윈도우 마지막 위치가 ROW수만큼 다음이 마지막 로우임을 의미
CURRENT ROW : 현재 로우까지를 의미
ROWS와 RANGE의 차이는 ROWS는 조회된 ROW 하나하나를 대상으로 연산하며,
RANGE는 ORDER BY 를 통해 정렬된 컬럼에 같은 값이 존재하는 ROW가 여러 개일 경우, 동일한 컬럼값을 가지는 모든 ROW를 묶어서 연산을 합니다.
문제8 "직업별 평균급여중" 가장 최소인 직업을
출력하시오. (값이 다르게 나오는지 확인 후 암기)
JOB AVG(SAL)
CLERK 1037.5
"직업별 평균급여중" -> 그룹을 나타내는 결과 집합의 행에 적용
//HAVING 절은 WHERE 절과 비슷하지만 그룹 전체 즉, 그룹을 나타내는 결과 집합의 행에만 적용된다는 점에서 차이가 있습니다.
반면, WHERE 절은 개별 행에 적용됩니다.
쿼리에는 WHERE 절과 HAVING 절이 모두 포함될 수 있습니다.//
SELECT JOB, AVG(SAL)
FROM EMP
WHERE AVG(SAL) = (SELECT MIN(AVG(SAL)) FROM EMP GROUP BY JOB)
GROUP BY JOB;
select job, avg(sal)
from emp
group by job
having avg(sal) = (select min(avg(sal))
from emp
group by job);