"고객들을 출생 연대에 따라 "1990년대생", "1980년대생", "그 이전 출생"으로 분류하고, 각 그룹에 고객이 총 몇 명씩 있는지 알고 싶다."
- 분류(Classification): CASE 문을 사용해 각 고객에게 "1990년대생", "1980년대생", "그 이전 출생" 중 하나의 라벨을 붙여준다.
- 집계(Aggregation): 1단계에서 만들어진 라벨을 기준으로 "GROUP BY"하고, "COUNT()" 함수를 사용해 각 라벨(그룹)에 속한 고객 수를 센다.
1단계: CASE 문으로 각 고객 분류하기
select
name,
birth_date,
case
when year(birth_date) >= 1990 then '1990년대생'
when year(birth_date) >= 1980 then '1980년대생'
else '그 이전 출생'
end as birth_decade
from users;

- 이렇게 CASE 문이 만들어낸 새로운 가상 컬럼 "birth_decade"가 성공적으로 생성된 것을 볼 수 있다.
2단계: GROUP BY로 그룹화하고 COUNT로 집계하기
select
case
when year(birth_date) >= 1990 then '1990년대생'
when year(birth_date) >= 1980 then '1980년대생'
else '그 이전 출생'
end as birth_decade,
count(*) as customer_count
from users
group by
case
when year(birth_date) >= 1990 then '1990년대생'
when year(birth_date) >= 1980 then '1980년대생'
else '그 이전 출생'
end
;

- 1단계에서 만든 저 가상 컬럼 "birth_decade"를 "GROUP BY"의 기준으로 삼으면 된다.
select
case
when year(birth_date) >= 1990 then '1990년대생'
when year(birth_date) >= 1980 then '1980년대생'
else '그 이전 출생'
end as birth_decade,
count(*) as customer_count
from users
group by birth_decade -- 원칙적으로 안되나 MYSQL에서 허용 GroupBy가 먼저 실행되기 때문에 원칙적으로 안됨
;

- SQL 표준의 논리적 실행 순서에 따르면 "GROUP BY"절이 "SELECT" 절보다 먼저 처리된다.
- 따라서 원칙적으로는 "SELECT"절에서 정의한 별칭(birth_decade)을 "GROUP BY"절에서 사용할 수 없다. 하지만 MySQL을 포함한 최신 버전의 많은 데이터베이스들은 사용자 편의를 위해 이러한 별칭 사용을 예외적으로 허용한다.
'데이터 베이스 > 데이터베이스 기본' 카테고리의 다른 글
| Ch06. 뷰 - 뷰(View)란? (0) | 2026.06.03 |
|---|---|
| Ch05. CASE문 - 조건부 집계 (0) | 2026.06.02 |
| Ch05. CASE문 - CASE문 기본 (0) | 2026.06.02 |
| Ch04. UNION - UNION 정렬 (0) | 2026.05.31 |
| Ch04. UNION - UNION ALL (0) | 2026.05.31 |