https://school.programmers.co.kr/learn/courses/30/lessons/284530
코드설명
YEAR + DATE_FORMAT + ROUND + AVG + GROUP BY + ORDER BY 가 사용됩니다.
문제에서 특이사항은 연도를 나눌떄 DATE_FORMAT이 아닌 YEAR를 사용해야 통과합니다.
또한, 문제에서 AS PM.25 로 하면 오류가 납니다. AS "PM2.5"로 문자열로 처리해야합니다.
SELECT -> FROM -> WHERE -> GROUP BY -> HAVING 순서로 SQL이 처리된다는 것을 인지해야 합니다.
또한, HAVING 절에는 GROUP BY에 명시된 칼럼, 혹은 집계함수만 들어갈 수 있습니다.
처음에, 아래와 같이 LOCATION2를 HAVING절에 넣었는데, GROUP BY 칼럼에 명시되있지도 않고, 집계함수도 아니기에 작동하지 않습니다.
SELECT YEAR(YM) AS YEAR, ROUND(AVG(PM_VAL1), 2) AS PM10, ROUND(AVG(PM_VAL2), 2) AS "PM2.5"
FROM AIR_POLLUTION
GROUP BY YEAR(YM)
HAVING LOCATION2 = '수원' //틀린코드입니다!
ORDER BY YEAR(YM) ASC
HAVING절에 GROUP BY에는 명시되있지 않지만, 집계함수를 사용할 수 있음입니다.
SELECT YEAR(YM) AS YEAR, ROUND(AVG(PM_VAL1), 2) AS PM10, ROUND(AVG(PM_VAL2), 2) AS "PM2.5"
FROM AIR_POLLUTION
# WHERE LOCATION2 IN ('수원')
GROUP BY YEAR(YM)
HAVING COUNT(*) > 3
ORDER BY YEAR(YM) ASC
좀 더 자세하게 알아보겠습니다.
SELECT AVG(AP.PM_VAL1)
FROM AIR_POLLUTION AS AP
WHERE AP.LOCATION2 = '수원'
수원 지역의 평균 값이 나옵니다.
SELECT AP.YM, AVG(AP.PM_VAL1)
FROM AIR_POLLUTION AS AP
WHERE AP.LOCATION2 = '수원'
실패 (1140, "In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column 'programmers.AP.YM'; this is incompatible with sql_mode=only_full_group_by")
하지만, 이 위의 코드는 AP.YM을 출력하려고하면 실패합니다.
이유는, GROUP BY 가 없기 떄문입니다. 즉, AP.YM에 그룹에 대한 AVG를 구하려면 GROUP BY 가 필요합니다.
코드
정답코드입니다.
SELECT YEAR(YM) AS YEAR, ROUND(AVG(PM_VAL1), 2) AS "PM10", ROUND(AVG(PM_VAL2), 2) AS "PM2.5"
FROM AIR_POLLUTION
WHERE LOCATION2 = '수원'
GROUP BY YEAR
ORDER BY YEAR ASC;
SELECT YEAR(AP.YM) AS YEAR, ROUND(AVG(AP.PM_VAL1), 2) AS `PM10`, ROUND(AVG(AP.PM_VAL2), 2) AS `PM2.5`
FROM AIR_POLLUTION AS AP
WHERE AP.LOCATION2 = '수원'
GROUP BY YEAR
ORDER BY YEAR ASC
DATE_FORMAT을 사용할경우 타입으로 인해 오류가납니다.
SELECT DATE_FORMAT(YM, '%Y') AS YEAR, ROUND(AVG(PM_VAL1), 2) AS "PM10", ROUND(AVG(PM_VAL2), 2) AS "PM2.5"
FROM AIR_POLLUTION
WHERE LOCATION2 = '수원'
GROUP BY YEAR
ORDER BY YEAR ASC;
정답코드입니다. IN을 사용한 코드.
SELECT YEAR(YM) AS YEAR, ROUND(AVG(PM_VAL1), 2) AS PM10, ROUND(AVG(PM_VAL2), 2) AS "PM2.5"
FROM AIR_POLLUTION
WHERE LOCATION2 IN ('수원')
GROUP BY YEAR(YM)
ORDER BY YEAR(YM) ASC