class="layout-aside-right paging-number">
본문 바로가기
TIL

[TIL158] solvesql - 요일별 대기오염도

by heestory323 2026. 6. 19.

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에만 사용하고 출력하지 않아도 된다.