지금 solvesql에서 12월동안 하루에 한 문제씩 따끈한 문제를 풀어볼 수 있는 소소한 챌린지를 하고 있는데요! 좀 고민이 필요했던 문제들을 정리해보려고 합니다.
문제요약
mesurments
테이블에서 요일별 대기 오염도 평균을 계산하는 쿼리를 작성해주세요.- 대기 오염도 값음 소수점 4째 짜리까지
- 결과 쿼리는 월요일-> 일요일 순으로 출력되어야 합니다.
SELECT CASE WHEN weekday = 0 THEN '일요일'
WHEN weekday = 1 THEN '월요일'
WHEN weekday = 2 THEN '화요일'
WHEN weekday = 3 THEN '수요일'
WHEN weekday = 4 THEN '목요일'
WHEN weekday = 5 THEN '금요일'
WHEN weekday = 6 THEN '토요일' ELSE '' END as weekday # 날짜 형태를 문자로
, no2, o3, co, so2, pm10, pm2_5
FROM (SELECT DATE_FORMAT(measured_at,'%w') as weekday
, ROUND(AVG(no2),4) no2
, ROUND(AVG(o3),4) o3
, ROUND(AVG(co),4) co
, ROUND(AVG(so2),4) so2
, ROUND(AVG(pm10),4) pm10
, ROUND(AVG(pm2_5),4) pm2_5
FROM measurements
GROUP BY DATE_FORMAT(measured_at,'%w')) A # 날짜 형태를 바꾸고, 집계된 TABLE
ORDER BY
CASE WHEN weekday = 0 THEN 7 ELSE weekday
END # 일요일을 맨 마지막으로
위 문제의 핵심 key는 요일별로 집계한뒤, 월요일 부터 일요일 순으로 나열하기 위한 방법을 찾는 것 입니다. 저는
order by
에 조건문을 이용하여 해결했습니다!
우선 %Y-%M-%d
형태의 DATE_FORMAT 을 '%w'
요일별로 바꾸게 되면 일요일(0) ~ 토요일(7)
의 값으로 바뀌게 되는데요. 이대로 Order by 하게 되면 일요일(0)부터 출력되는 문제가 생깁니다. 문제를 풀면서 저도 알게 되었지만 Order by에도 조건문이 가능하다는 사실! weekday= 0 (일요일) 에 해당하는 부분을 7로 바꿔서 일요일이 맨 마지막에 오도록 해주었습니다. (물론, 처음부터 0을 7로 바꿔서 하는 방법도 있을 것 입니다!)