SQL GROUP BY, WITH ROLLUP

dong5854·2022년 3월 27일
0

sql

목록 보기
5/7

GROUP BY

특정 컬럼들 그룹화하기 위해서는 GROUP BY를 사용해 데이터를 그룹화 해야한다.

GROUP BY를 사용할 때 기억할 것이 두가지가 있는데
1. GROUP BY는 DISTINCT와 얼핏 같아 보일 수 있지만 DISTINCT는 단순히 컬럼 내 데이터를 중복을 조회해서 조회하는 것이고,
GROUP BY는 컬럼 내 데이터를 그룹핑 해서 보여주는 것이기 때문에 집계 함수를 사용할 수 있다.
2. 그룹화한 결과에 조건을 걸어주기 위해서는 HAVING을 사용해야 한다.

WHERE과 HAVNG이 헷갈릴 수 있는데 WHERE는 그룹화를 하기 전, HAVING은 그룹화 후의 조건이다.


사용법

# 컬럼 그룹화
SELECT 컬럼 FROM 테이블 GROUP BY 그룹화할 컬럼;

#조건 처리 후에 컬럼 그룹화
SELECT 컬럼 FROM 테이블 WHERE 조건식 GROUP BY 그룹화할 컬럼;

#컬럼 그룹화 후에 조건 처리
SELECT 컬럼 FROM 테이블 GROUP BY 그룹화할 컬럼 HAVING 조건식;

#조건 처리 후에 컬럼 그룹화 후에 조건 처리
SELECT 컬럼 FROM 테이블 WHERE 조건식 GROUP BY 그룹화할 컬럼 HAVING 조건식;

#ORDER BY가 존재하는 경우
SELECT 컬럼 FROM 테이블 [WHERE 조건식]
GROUP BY 그룹화할 컬럼 [HAVING 조건식] ORDER BY 컬럼1 [, 컬럼2, 컬럼3 ...];

출처: https://extbrain.tistory.com/56 [확장형 뇌 저장소]

GROUP BY를 쓸때 SELECT 절

GROUP BY를 쓸 때 SELECT 절에는
1. GROUP BY뒤에서 사용한 컬럼들 또는
2. COUNT, MAX와 같은 집계 함수들만
사용할 수 있다.

이는 위의 두 조건에 부합하지 않으면 에러 메세지가 뜬다. 위의 두 조건 외의 컬럼은 해당 컬럼을 어떻게 보여주어야 할 지 결정할 수가 없기 때문이다.


WITH ROLLUP

WITH ROLLUP은 그룹별로 합계를 한 번에 구할 때 사용된다.

SELECT SUBSTRING(address, 1, 2) as region, gender, COUNT(*)
FROM main_database.member
GROUP BY SUBSTRING(address, 1, 2), gender
ORDER BY region ASC, gender DESC;

SELECT SUBSTRING(address, 1, 2) as region, gender, COUNT(*)
FROM main_database.member
GROUP BY SUBSTRING(address, 1, 2), gender WITH ROLLUP
ORDER BY region ASC, gender DESC;

첫번째 SQL문은 WITH ROLLUP을 사용하지 않았고, 두번째 SQL문은 WITH ROLLUP을 사용한 결과이다.

위의 결과들을 보면 같은 지역의 gender들의 합이 마치 말려 올라가며(WITH ROLLUP) 계산된 모습을 보이고,

위와 같이 모든 region과 gender의 count의 합 또한 확인할 수 있다.

이 WITH ROLLUP에 대해 추가적으로 2가지 더 알아두면 좋은 사실이 있는데,

1. GROUP BY 뒤 기준들의 순서에 따라 WITH ROLLUP의 결과도 달라진다.

WITH ROLLUP은 GROUP BY 뒤에 나오는 그루핑 기준의 등장 순서에 따라 계층적인 부분 총계를 보여준다. 이 때문에 GROUP BY 뒤에 나오는 그루핑 기준의 등장 순서에 따라 WITH ROLLUP이 출력하는 결과가 달라진다.

2. NULL 임을 나타내기 위해 쓰인 NULL과 부분 총계를 나타내기 위해 쓰인 NULL

다음 결과를 보면 많은 NULL들이 있는데 이런 NULL 값이 NULL 임을 나타내기 위해 쓰인 NULL인지 부분 총계를 나타내기 위해 쓰인 NULL 인지 구분하기 어렵다.

이 둘을 구분하기 위해서는 GROUPING이라는 함수를 사용해야 한다.

SELECT SUBSTRING(address, 1, 2) as region, gender, COUNT(*),
GROUPING(SUBSTRING(address, 1, 2)),GROUPING(gender)
FROM copang_main.member
GROUP BY SUBSTRING(address, 1, 2), gender WITH ROLLUP
ORDER BY region ASC, gender DESC;

해당 sql문은 GROUPING 함수를 사용해 결과를 보여준 것인데, GROUPING 함수는 그 인자를 그루핑 기준에서 고려하지 않은 부분 총계인 경우에 1을 반환하고 그렇지 않은 경우 0을 반환한다.

즉 실제로 NULL을 나태내기 위해 사용된 NULL은 0, 부분 총계를 나타내기 위해 표시된 NULL은 1을 반환해 이 둘을 구분할 수 있게 해준다.

profile
https://github.com/dong5854?tab=repositories

0개의 댓글