이 글은 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 구에 바로 식을 작성할 수 있다는 사실을 기억하여 추후 쿼리 작성시 참고하여 사용할 수 있을 것 같습니다.