[SQL] GROUP BY의 진가

baekdata·2021년 10월 1일
0

SQL

목록 보기
3/3

이 글은 SQL 레벨업(한빛 미디어, 미크)를 참고하여 작성하였습니다.

결론 = GROUP BY에도 식 적용이 가능하다.

GROUP BY에는 "집약" 기능과 "자르기" 기능이 있습니다.
모집합 테이블을 작은 부분 집합들로 자르는 것을 의미합니다.

그리고, 그렇게 잘려진 작은 하나하나의 부분 집합을 수학적으로는 파티션이라고 합니다.

예를 들어, 나이를 기준으로 "어린이", "성인", "노인"으로 자르고 각 파티션의 숫자를 세는 쿼리를 작성한다고 가정해봅시다. 아래와 같이 2가지 방법이 가능할텐데요.

먼저, 서브쿼리를 이용해 그룹 기준 컬럼을 생성하고 그 컬럼을 GROUP BY 기준으로 세워 집계하는 방식입니다.

SELECT age_class, count(*)
FROM (
	SELECT *
	     , CASE 
		 WHEN age < 20 THEN '어린이'
		 WHEN age BETWWEEN 20 AND 69 THEN '성인'
		 WHEN age >= 70 THEN '노인'
	       ELSE NULL END AS age_class 
	 FROM Persons
    ) T1
GROUP BY age_class

다음으로는, GROUP BY 구 안에 수식을 작성하여 집계하는 방식입니다.

SELECT CASE 
	 WHEN age < 20 THEN '어린이'
	 WHEN age BETWWEEN 20 AND 69 THEN '성인'
	 WHEN age >= 70 THEN '노인'
       ELSE NULL END AS age_class 
     , COUNT(*)
FROM Persons
GROUP BY CASE 
	   WHEN age < 20 THEN '어린이'
	   WHEN age BETWWEEN 20 AND 69 THEN '성인'
	   WHEN age >= 70 THEN '노인'
	  ELSE NULL END;

위와 같이 2가지 방법 중에 저는 1번 방식을 선호하기는 했었는데요, 사실 조금 더 GROUP BY구 본래 역할에 충실한 방법은 2번인 것 같습니다. GROUP BY가 가지고 있는 집약과 자르기를 동시에 사용하기 때문입니다.

물론, 식의 가독성과 실행 계획 등을 면밀히 살펴본 것은 아니기에 틀린 말일 수도 있습니다.

그러나, GROUP BY 구에 바로 식을 작성할 수 있다는 사실을 기억하여 추후 쿼리 작성시 참고하여 사용할 수 있을 것 같습니다.

profile
글쓰는 데이터 분석가

0개의 댓글