[SQL문제풀기] 서울숲 요일별 대기오염도 계산하기

silver's avatar
Mar 13, 2025
[SQL문제풀기] 서울숲 요일별 대기오염도 계산하기
Contents
문제SQLite

문제

SQLite

내가 작성한 정답

select 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 (select case strftime('%w',measured_at) when '0' then '일요일' when '1' then '월요일' when '2' then '화요일' when '3' then '수요일' when '4' then '목요일' when '5' then '금요일' when '6' then '토요일' end "weekday", no2, o3, co, so2,pm10,pm2_5 from measurements) group by weekday order by case weekday when '월요일' then 1 when '화요일' then 2 when '수요일' then 3 when '목요일' then 4 when '금요일' then 5 when '토요일' then 6 when '일요일' then 7 end
💡

date에서 요일 구하기

SQLite // %w: 0 (일요일)부터 6 (토요일)까지의 숫자로 요일을 반환 // %A: 요일의 이름을 반환 SELECT strftime('%w', '2025-03-13') -- 숫자로 요일 반환 SELECT strftime('%A', '2025-03-13') -- 요일 이름 반환 Oracle // 요일 숫자 (1=일요일, 2=월요일, ..., 7=토요일) SELECT TO_CHAR(TO_DATE('2025-03-13', 'YYYY-MM-DD'), 'D') -- 숫자로 요일 반환 SELECT TO_CHAR(TO_DATE('2025-03-13', 'YYYY-MM-DD'), 'DAY') -- 요일 이름 반환 MySQL // 요일 숫자 (1=일요일, 2=월요일, ..., 7=토요일) - oracle과 동일 SELECT DAYOFWEEK('2025-03-13') -- 숫자로 요일 반환 SELECT DATE_FORMAT('2025-03-13', '%W') -- 요일 이름 반환
 

Oracle

SELECT TO_CHAR(measured_at, 'DAY', 'NLS_DATE_LANGUAGE=KOREAN') 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 WHERE station = '서울숲' GROUP BY TO_CHAR(measured_at, 'D'), TO_CHAR(measured_at, 'DAY', 'NLS_DATE_LANGUAGE=KOREAN') // 월요일부터 정렬하려면, 오라클의 NLS 설정에 따라 다를 수 있음 // -> 강제적으로 월요일부터 정렬하려면 DECODE() 또는 CASE 사용 ORDER BY TO_CHAR(measured_at, 'D');

MYSQL

SELECT CASE DAYOFWEEK(measured_at) WHEN 2 THEN '월요일' WHEN 3 THEN '화요일' WHEN 4 THEN '수요일' WHEN 5 THEN '목요일' WHEN 6 THEN '금요일' WHEN 7 THEN '토요일' WHEN 1 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 WHERE station = '서울숲' GROUP BY DAYOFWEEK(measured_at) // FIELD() : 주어진 값이 특정 리스트에서 몇 번째 위치하는지 반환 ORDER BY FIELD(DAYOFWEEK(measured_at), 2, 3, 4, 5, 6, 7, 1);
 
DBMS
요일 추출 함수
정렬 방식
SQLite
strftime('%w', measured_at)
CASE 문 활용
Oracle
TO_CHAR(measured_at, 'DAY', 'NLS_DATE_LANGUAGE=KOREAN')
TO_CHAR(measured_at, 'D') 활용
MySQL
DAYOFWEEK(measured_at)
FIELD() 활용
Share article

silver