문제
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