프로그래밍 숲

GROUPING, CASE ELSE, ROLLUP이 포함된 SQL문 분석하기 본문

카테고리 없음

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
반응형
Comments