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

 

프로그래머스

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

programmers.co.kr

코드설명

GROUP BY + ROUND + CONCAT + ORDER BY 를 활용합니다.

 

문제에서 유의해야할점은 ORDER BY 부분입니다.

문제에서 AS TOTAL_DISTANCE를 활용해서 정렬을 할경우, TOTAL_DISTANCE는 CONCAT함수가 붙음으로써 올바르게 정렬이 안됩니다.

그렇기에, ROUND(SUM(D_BETWEEN_DIST),1) DESC 를 활용하거나,

단순히 SUM(D_BETWEEN_DIST) 로 해도 가능하지만 엄밀하게 말하면 ROUND 한 값으로 처리해주는 것이 더 명확합니다.

 

SELECT문에 명시된 값 중 CONCAT이나 어떤 가공함수가 들어간 것일경우에 직접 정렬조건으로 사용하는 것보다는 새롭게 선언해서 사용하는것이 안전합니다.

코드

-- 코드를 작성해주세요
SELECT ROUTE, CONCAT(ROUND(SUM(D_BETWEEN_DIST), 1), "km") AS TOTAL_DISTANCE, CONCAT(ROUND(AVG(D_BETWEEN_DIST), 2), "km") AS AVERAGE_DISTANCE
FROM SUBWAY_DISTANCE
GROUP BY ROUTE
ORDER BY ROUND(SUM(D_BETWEEN_DIST), 1) DESC;

 

SELECT 
    SD1.ROUTE AS ROUTE,
    CONCAT(ROUND(SUM(SD1.D_BETWEEN_DIST), 1), "km") AS TOTAL_DISTANCE,
    CONCAT(ROUND(AVG(SD1.D_BETWEEN_DIST), 2), "km") AS AVERAGE_DISTANCE
FROM SUBWAY_DISTANCE AS SD1
GROUP BY SD1.ROUTE
ORDER BY ROUND( SUM(SD1.D_BETWEEN_DIST),1 ) DESC

 

ORDER BY 절을 SUM(D_BETWEEN_DIST) DESC로 변경했습니다. 이는 'km' 문자열이 포함된 TOTAL_DISTANCE로 정렬하면 문자열 정렬이 되어 원하는 결과가 나오지 않기 때문입니다.

SELECT SD.ROUTE, CONCAT(ROUND( SUM(D_BETWEEN_DIST), 1), 'km') AS TOTAL_DISTANCE , CONCAT(ROUND( AVG(D_BETWEEN_DIST), 2), 'km') AS AVERAGE_DISTANCE
FROM SUBWAY_DISTANCE AS SD
GROUP BY SD.ROUTE
# ORDER BY TOTAL_DISTANCE DESC
ORDER BY SUM(D_BETWEEN_DIST) DESC

+ Recent posts