[MySQL] 노선별 평균 역 사이 거리 조회(Lv.2)

SQL

목록 보기
8/8
post-thumbnail

링크 :

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

구할 값 :
테이블에서 노선별로 노선, 총 누계거리, 평균 역 사이 거리를 노선별로 조회.

조건 :
1) 총 누계거리와 평균 역 사이 거리 컬럼명은 TOTAL_DISTANCE, AVERAGE_DISTANCE로 지정
2) 총 누계거리는 소수점 둘째자리, 평균 역 사이 거리는 소수점 셋째자리에서 반올림
3) 총 누계거리와 평균 역 사이 거리는 단위(km)와 함께 출력
4) 결과는 총 누계거리 기준 내림차순

풀이

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 ROUND(SUM(D_BETWEEN_DIST), 2) DESC;

틀린 풀이

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

1) 반올림 위치 실수 -> 소수점 둘째자리에서 반올림이면 첫째자리까지 나와야 하니 round(~, 2) -> round(~, 1)로 바꿔야 함.
2) concat()함수 쓰면 결과값은 String이므로 order by 의 값을 round(sum(~), ~)으로 바꿔야한다.
+) 물론 문자열로 order by 할 수 있지만 문자열의 경우 문자의 순서, 숫자의 경우 수의 크기를 기준으로 정렬하기 때문에 정렬의 순서가 달라질 수 있어 오답처리 된다.
ex) 11, 2 의 경우
문자열 정렬 결과 :11, 2
숫자 정렬 결과 : 2, 11

알아둘 것 :

1) CONCAT(값, '붙일 단위나 문자')
2) ROUND(값, 반올림으로 나타낼 위치) -> -1이면 10의 자리까지 표시(=1의 자리에서 반올림), 0이면 1의자리까지(= 소수점 첫째자리에서 반올림), 1이면 소수점 첫째자리까지(=소수점 둘쨰자리에서 반올림)
3) GROUP BY(그룹의 기준이 되는 컬럼)

profile
두둥탁 뉴비등장

0개의 댓글