Image

Lv.2 🔗노선별 평균 역 사이 거리 조회하기

📝문제 요약

문제 설명

SUBWAY_DISTANCE 테이블은 서울지하철 2호선의 역 간 거리 정보를 담은 테이블입니다. SUBWAY_DISTANCE 테이블의 구조는 다음과 같으며 LINENOROUTESTATION_NAMED_BETWEEN_DISTD_CUMULATIVE는 각각 호선, 순번, 노선, 역 이름, 역 사이 거리, 노선별 누계 거리를 의미합니다.

Column name Type Nullable
LINE VARCHAR(10) FALSE
NO NUMBER FALSE
ROUTE VARCHAR(50) FALSE
STATION_NAME VARCHAR(100) FLASE
D_BETWEEN_DIST NUMBER FLASE
D_CUMULATIVE NUMBER FLASE

문제

SUBWAY_DISTANCE 테이블에서 노선별로 노선, 총 누계 거리, 평균 역 사이 거리를 노선별로 조회하는 SQL문을 작성해주세요.

총 누계거리는 테이블 내 존재하는 역들의 역 사이 거리의 총 합을 뜻합니다. 총 누계 거리와 평균 역 사이 거리의 컬럼명은 각각 TOTAL_DISTANCEAVERAGE_DISTANCE로 해주시고, 총 누계거리는 소수 둘째자리에서, 평균 역 사이 거리는 소수 셋째 자리에서 반올림 한 뒤 단위(km)를 함께 출력해주세요.

결과는 총 누계 거리를 기준으로 내림차순 정렬해주세요.


예시

SUBWAY_DISTANCE 테이블이 다음과 같을 때

LINE NO ROUTE STATION_NAME D_BETWEEN_DIST D_CUMULATIVE
2호선 45 성수지선 용답 2.3 51.1
2호선 46 성수지선 신답 1 52.1
2호선 47 성수지선 용두(동대문구청) 0.9 53
2호선 48 성수지선 신설동 1.2 54.2
2호선 49 신정지선 도림천 1 55.2
2호선 50 신정지선 양천구청 1.7 56.9
2호선 51 신정지선 신정네거리 1.9 58.8
2호선 52 신정지선 까치산 1.4 60.2

SQL을 실행하면 다음과 같이 출력되어야 합니다.

ROUTE TOTAL_DISTANCE AVERAGE_DISTANCE
신정지선 6km 1.5km
성수지선 5.4km 1.35km


✏️문제 풀이

SELECT

SELECT ROUTE, 
    CONCAT(ROUND(SUM(D_BETWEEN_DIST), 1), 'km') AS TOTAL_DISTANCE, 
    CONCAT(ROUND(AVG(D_BETWEEN_DIST), 2), 'km') AS AVERAGE_DISTANCE
  • ROUTE : 노선
  • TOTAL_DISTANCE : 총 누계 거리
    • SUM(D_BETWEEN_DIST) : 각 노선별로 두 역 사이 거리의 합계
    • ROUND(…, 1) : 소수점 1자리로 반올림
    • CONCAT(…, 'km') : 단위 km를 문자열로 붙임
  • AVERAGE_DISTANCE평균 역 사이 거리
    • AVG(D_BETWEEN_DIST) : 각 노선의 평균 역 간 거리
    • ROUND(…, 2) : 소수점 2자리로 반올림
    • CONCAT(…, 'km') : 단위 km를 문자열로 붙임

FROM

FROM SUBWAY_DISTANCE
  • SUBWAY_DISTANCE 테이블의 데이터를 가져옴

GROUP BY

GROUP BY ROUTE
  • 첫 번째 컬럼(ROUTE) 기준으로 그룹화

ORDER BY

ORDER BY SUM(D_BETWEEN_DIST) DESC
  • 총 누계 거리를 기준으로 내림차순 정렬
  • 여기서, ORDER BY 2 DESC 가 틀릴 수 있는 이유
    • ORDER BY 2 DESCTOTAL_DISTANCE 컬럼을 기준으로 정렬하긴 하지만, TOTAL_DISTANCE가 문자열('34.52km')로 되어 있기 때문에 정확한 수치 정렬이 안 됨!
    • 그래서 ORDER BY SUM(D_BETWEEN_DIST)처럼 숫자 기준으로 정렬해야 합니다.


💯제출 코드

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 SUM(D_BETWEEN_DIST) DESC

댓글남기기