반응형

1. Group by절

  • Group by 란?
    • 특정 컬럼값을 기준으로 그룹화함
    • 각 그룹에 대한 합계, 평균, 개수 등의 함수 적용 가능
    • 예) 이름으로 그룹핑 및 각 그룹의 평균 계산 후 평균으로 내림차순 정렬
SELECT NAME, AVG(SCORE) AS AVG_SCORE
FROM SCORELIST GROUP BY NAME
ORDER BY AVG_SCORE DESC

2. Having절

  • Having 절이란?
    • Group by의 결과를 특정조건으로 필터링하는 기능
    • 예시) 평균이 94점 이상인 이름(그룹)만 출력
SELECT NAME, AVG(SCORE) AS AVG_SCORE
FROM SCORELIST GROUP BY NAME
having AVG(SCORE)  >= 94

3. GROUPING SETS절

  • Grouping sets절이란?

    • 여러 칼럼에 대한 여러 개의 집계를 한번에 출력할 때 사용
  • Grouping sets의 필요성

    • 만약 과목별 평균과 이름별 평균, 전체 평균 정보를 한번에 보고 싶다면...
    • 아래와 같이 하나씩 Group by 한 결과를 Union All 해서 출력 가능
-- 1. 전체 평균 계산
SELECT NULL,   NULL, AVG(SCORE) FROM SCORELIST
-- 2. 과목, 이름별 평균 계산
UNION ALL
SELECT SUBJECT, NAME, AVG(SCORE) FROM SCORELIST GROUP BY SUBJECT, NAME
-- 3. 과목별 평균 계산
UNION ALL
SELECT SUBJECT, NULL, AVG(SCORE) FROM SCORELIST GROUP BY SUBJECT
-- 4. 이름별 평균 계산
UNION ALL
SELECT NULL,    NAME, AVG(SCORE) FROM SCORELIST GROUP BY NAME
  • 상기 예제를 Grouping sets 절로 구현
    • 수행 속도가 더 빠르고 간단함
SELECT SUBJECT, NAME, AVG(SCORE) FROM SCORELIST
GROUP BY
GROUPING SETS(
    (SUBJECT, NAME),
    SUBJECT,
    NAME,
    ()
)

4. ROLL UP 절

  • ROLL UP 이란?
    • 지정된 GROUPING 컬럼의 소계를 생성함
  • ROLL UP의 원리
    • 인자로 들어온 컬럼을 오른쪽부터 하나씩 빼면서 Group 생성
  • 예제 1, 2, 3 비교(아래 그림 참고)
    • SUBJECT, NAME 으로 그룹핑 하여 평균 출력하는 부분은 동일함
  • 예제 1) GROUP BY ROLLUP( SUBJECT, NAME )
    • SUBJECT, NAME에서 오른쪽인 NAME이 제외된 SUBJECT 그룹으로 평균 출력
    • 그 다음으로 SUBJECT가 제외되어 아무것도 없고 GROUP BY절에도 아무것도 없으므로 전체 평균 출력
  • 예제 2) GROUP BY SUBJECT, ROLLUP( NAME )
    • ROLLUP에 NAME뿐이어서 NAME이 제외되면 아무것도 없으므로 GROUP BY에 있는 SUBJECT 그룹으로 평균 출력
  • 예제 3) GROUP BY ROLLUP((SUBJECT, NAME))
    • ROLLUP에 SUBJECT, NAME이 괄호안에 하나의 그룹이고, 제외 되면 아무 것도 없으므로 전체 평균 출력

5. CUBE 절

  • CUBE란?

    • 지정된 GROUPING 컬럼의 다차원 소계를 생성함
  • ROLL UP과의 차이

    • ROLL UP은 오른쪽부터 순서대로 하나씩 뺌

    • CUBE는 방향 상관없이 하나씩 빼며 모든 가능한 조합의 Group 생성

    • CUBE와 ROLLUP의 그룹 조합 차이

      CUBE(C1, C2) ROLLUP(C1,C2)
      C1, C2 C1, C2
      C1 C1
      C2 X
      () ()
  • 예제 1, 2, 3 비교(아래 그림 참고)

    • SUBJECT, NAME 으로 그룹핑 하여 평균 출력하는 부분은 동일함
  • 예제 1) GROUP BY CUBE( SUBJECT, NAME )

    • SUBJECT, NAME에서 NAME이 제외된 SUBJECT 그룹으로 평균 출력
    • SUBJECT, NAME에서 SUBJECT가 제외된 NAME 그룹으로 평균 출력
    • 그 다음으로 모두 제외되어 아무것도 없고 GROUP BY절에도 아무것도 없으므로 전체 평균 출력
  • 예제 2) GROUP BY SUBJECT, CUBE( NAME )

    • CUBE에 NAME뿐이어서 NAME이 제외되면 아무것도 없으므로 GROUP BY에 있는 SUBJECT 그룹으로 평균 출력
  • 예제 3) GROUP BY CUBE((SUBJECT, NAME))

    • CUBE에 SUBJECT, NAME이 괄호안에 하나의 그룹이고, 제외 되면 아무 것도 없으므로 전체 평균 출력

# 참고

반응형

'데이터 분석 > SQL' 카테고리의 다른 글

[SQL] 5. 집합 연산자  (0) 2021.04.19
[SQL] 4. 분석 함수  (0) 2021.04.05
[SQL] 2. 데이터 조인  (0) 2021.03.29
[SQL] 1. 데이터 조회와 필터링  (0) 2021.03.23
Postgresql 설치(postGIS 포함)  (0) 2021.03.16

+ Recent posts