카테고리 없음
GROUPING, CASE ELSE, ROLLUP이 포함된 SQL문 분석하기
jjscript
2023. 6. 11. 09:41
728x90
반응형
GROUPING, CASE ELSE, ROLLUP이 포함된 다음의 SQL문을 분석해 보도록 하겠습니다.
SELECT
CASE
WHEN GROUPING(a.서비스ID) = 0 THEN a.서비스ID
ELSE '합계'
END AS 서비스ID,
CASE
WHEN GROUPING(b.가입일자) = 0 THEN COALESCE(b.가입일자, '-')
ELSE '소계'
END AS 가입일자,
COUNT(b.회원번호) AS 가입건수
FROM
서비스 a
LEFT OUTER JOIN 서비스가입 b ON (
a.서비스ID = b.서비스ID
AND b.가입일자 BETWEEN '2013-01-01'
AND '2013-01-31'
)
GROUP BY
ROLLUP(a.서비스ID, b.가입일자)
FROM → GROUP BY → SELECT 절의 순서대로 해석해 보도록 하겠습니다.
1. FROM 절
FROM
서비스 a
LEFT OUTER JOIN 서비스가입 b ON (
a.서비스ID = b.서비스ID
AND b.가입일자 BETWEEN '2013-01-01'
AND '2013-01-31'
)
1) 서비스 테이블과 서비스가입 테이블을 LEFT OUTER JOIN합니다.
2) 서비스ID와 가입일자를 기준으로 조인합니다. 가입일자는 '2013-01-01'부터 '2013-01-31' 사이의 값을 가지는 행만 고려합니다.
2. GROUP BY 절
GROUP BY
ROLLUP(a.서비스ID, b.가입일자)
1) ROLLUP 함수를 사용하여 서비스ID와 가입일자 열을 기준으로 그룹화합니다.
3. SELECT 절
SELECT
CASE
WHEN GROUPING(a.서비스ID) = 0 THEN a.서비스ID
ELSE '합계'
END AS 서비스ID,
CASE
WHEN GROUPING(b.가입일자) = 0 THEN COALESCE(b.가입일자, '-')
ELSE '소계'
END AS 가입일자,
COUNT(b.회원번호) AS 가입건수
1) CASE 문을 사용하여 열을 생성합니다
- 서비스ID 열: a.서비스ID가 그룹화되지 않은 경우에는 실제 서비스ID 값을 반환하고, 그렇지 않으면 '합계'를 반환합니다.
- 가입일자 열: b.가입일자가 그룹화되지 않은 경우에는 실제 가입일자 값을 반환하고, 그렇지 않으면 '-'를 반환합니다. 이 때, COALESCE 함수를 사용하여 NULL 값을 '-'로 대체합니다.
- 가입건수 열: b.회원번호의 수를 세어서 가입건수를 계산합니다.
2) 최종 결과로 서비스ID, 가입일자, 그리고 해당 그룹의 가입건수 값을 반환합니다.
728x90
반응형