본문 바로가기
Algorithm/Programmers SQL

[MySQL] 프로그래머스 노선별 평균 역 사이 거리 조회하기

by 제우제우 2024. 9. 7.

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

 

프로그래머스

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

programmers.co.kr

코딩테스트 연습 > GROUP BY > 노선별 평균 역 사이 거리 조회하기

 

문제 분석

난이도: LEVEL2

문제 요구사항

SUBWAY_DISTANCE 테이블에서 노선별로 노선, 총 누계 거리, 평균 역 사이 거리를 노선별로 조회하는 SQL문을 작성해주세요.
총 누계거리는 테이블 내 존재하는 역들의 역 사이 거리의 총 합을 뜻합니다. 총 누계 거리와 평균 역 사이 거리의 컬럼명은 각각 TOTAL_DISTANCE, AVERAGE_DISTANCE로 해주시고, 총 누계거리는 소수 둘째자리에서, 평균 역 사이 거리는 소수 셋째 자리에서 반올림 한 뒤 단위(km)를 함께 출력해주세요.
결과는 총 누계 거리를 기준으로 내림차순 정렬해주세요.

 

컬럼 

LINE: 호선 
NO: 순번 
ROUTE: 노선 
STATION_NAME: 역 이름 
D_BETWEEN_DIST: 역 사이 거리 
D_CUMULATIVE: 노선별 누계 거리 

 

km 추가: CONCAT() 활용 

반올림: ROUND() 활용 EX) 2번째 파라미터 1: 소수 둘째 자리에서 반올림 

오답 코드 

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

 

오답 이유

현재 정렬의 기준을 보면 TOTAL_DISTANCE DESC 이다. 

원하는 결과는 총 누계 거리를 기준으로 내림차순 정렬인데 예상대로 정렬되지 않는다. 

TOTAL_DISTANCE의 Type은 문자열이다. 

그럼 정렬 기준이 문자열인데 문자열의 정렬은 ASCII값 순서 즉 사전 순서대로 정렬이 된다. 

 

EX)

10.0KM, 9.0KM를 정렬할 때 '1', '9'를 비교해서 정렬하면 9.0km가 먼저 온다 

 

기준이 문자열 정렬이 아닌 숫자 타입으로 정렬하게 만들어준다. 

정답 코드 

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