TIL - GROUP BY와 ORDER BY의 관계
배운 내용
집계 쿼리에서 GROUP BY 와 ORDER BY를 사용할 때,
정렬용 컬럼을 반드시 SELECT에 출력해야 하는 것은 아니다.
또한 ORDER BY를 사용하기 위해 무조건 GROUP BY에 넣어야 하는 것도 아니다.
예제 문제
요일별 평균 대기오염도를 계산하고
월 → 화 → 수 → 목 → 금 → 토 → 일
순으로 출력하는 문제
내가 처음 작성한 코드
SELECT
DATE_FORMAT(measured_at,'%a') AS weekday,
ROUND(AVG(no2),4) AS no2
FROM measurements
GROUP BY DATE_FORMAT(measured_at,'%a')
문제점
요일명으로만 그룹화하면
Fri
Mon
Sat
Sun
Thu
Tue
Wed
처럼 정렬될 수 있다.
문제는
월 → 일
순 정렬을 요구한다.
해결 방법
요일 번호를 함께 사용
WEEKDAY(measured_at)
WEEKDAY 결과
요일번호
| 월 | 0 |
| 화 | 1 |
| 수 | 2 |
| 목 | 3 |
| 금 | 4 |
| 토 | 5 |
| 일 | 6 |
최종 패턴
SELECT
DATE_FORMAT(measured_at,'%a') AS weekday,
AVG(no2)
FROM measurements
GROUP BY
WEEKDAY(measured_at),
DATE_FORMAT(measured_at,'%a')
ORDER BY
WEEKDAY(measured_at);
이유
SELECT dept_id
는
- GROUP BY에 없음
- 집계함수도 아님
SQL 규칙
SELECT에 나오는 컬럼은
1. GROUP BY에 있거나
2. 집계함수여야 한다.
핵심 규칙
가능
SELECT dept_id,
COUNT(*)
FROM employees
GROUP BY dept_id;
가능
SELECT COUNT(*)
FROM employees
GROUP BY dept_id;
불가능
SELECT dept_id,
COUNT(*)
FROM employees
GROUP BY salary;
기억할 문장
GROUP BY 컬럼은 SELECT에 반드시 출력할 필요가 없다.
하지만 SELECT에 출력하는 일반 컬럼은
반드시 GROUP BY에 포함되거나
집계함수여야 한다.
실무 패턴
정렬용 컬럼과 출력용 컬럼을 분리한다.
SELECT
DATE_FORMAT(date,'%a') AS weekday
FROM table
GROUP BY
정렬용컬럼,
DATE_FORMAT(date,'%a')
ORDER BY
정렬용컬럼;
정답
-- 요일별 대기오염도 평균 계산
-- 월 ~ 일요일 순 출력
SELECT case
when weekday(measured_at) = 0 then '월요일'
when weekday(measured_at) = 1 then '화요일'
when weekday(measured_at) = 2 then '수요일'
when weekday(measured_at) = 3 then '목요일'
when weekday(measured_at) = 4 then '금요일'
when weekday(measured_at) = 5 then '토요일'
when weekday(measured_at) = 6 then '일요일' end as weekday,
ROUND(avg(no2),4) as no2,
ROUND(avg(o3),4) as o3,
ROUND(avg(co),4) as co,
ROUND(avg(so2),4) as so2,
ROUND(avg(pm10),4) as pm10,
ROUND(avg(pm2_5),4)as pm2_5
from measurements
group by weekday(measured_at), weekday
order by weekday(measured_at)
한 줄 요약
집계 쿼리에서 GROUP BY 컬럼을 SELECT에 출력할 필요는 없지만, SELECT에 출력하는 일반 컬럼은 반드시 GROUP BY에 포함되거나 집계함수로 처리되어야 한다. 정렬만 필요한 컬럼은 GROUP BY + ORDER BY에만 사용하고 출력하지 않아도 된다.
'TIL' 카테고리의 다른 글
| [TIL160] solvesql - 폐쇄할 따릉이 정류소 찾기 (0) | 2026.06.19 |
|---|---|
| [TIL159] solvesql - 전력소비량 이동평균 구하기 (0) | 2026.06.19 |
| [TIL157] solvesql - 언더스코어(_) 가 포함되지 않은 데이터 찾기 (0) | 2026.06.18 |
| [TIL156] solvesql - 세션 재정의하기 (0) | 2026.06.18 |
| [TIL155] solvesql - 데이터 그룹으로 묶기 (0) | 2026.06.18 |