250x250
반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 자료구조
- SQLD
- Node.js
- 기업 협업
- ROLLUP
- python
- 정규식 연산
- 문법 차이
- show graph characteristics
- 위코드
- GROUPING
- searched case expression
- window 함수
- 뷰
- simple case expression
- dense rank
- 정보처리기사
- sql 저장 모듈
- MYSQL
- 비절차적 데이터 조작어
- dom
- JavaScript
- execute immediate
- git
- SQL
- html
- coalesce
- list multiplication
- Oracle
- 코드 스니펫
Archives
- Today
- Total
프로그래밍 숲
GROUPING, CASE ELSE, ROLLUP이 포함된 SQL문 분석하기 본문
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
반응형
Comments