https://school.programmers.co.kr/learn/courses/30/lessons/284530

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

코드설명

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

 

+ Recent posts