미래를 예측하는 데이터분석가

[MYSQL] 노선별 평균 역 사이 거리 조회하기 본문

시스템 & 데이터베이스/SQL

[MYSQL] 노선별 평균 역 사이 거리 조회하기

잘하다연 2024. 12. 18. 22:07

문제 정리: 서울 지하철 2호선 역 간 거리 조회

1. 테이블 구조

컬럼명 데이터 타입 NULL 허용 설명
LINE VARCHAR(10) FALSE 호선 (예: "2호선")
NO NUMBER FALSE 역 순번
ROUTE VARCHAR(50) FALSE 노선명 (예: "성수지선")
STATION_NAME VARCHAR(100) FALSE 역 이름
D_BETWEEN_DIST NUMBER FALSE 역 사이 거리
D_CUMULATIVE NUMBER FALSE 누적 거리

2. 요구사항

  • 노선(ROUTE) 별로 총 누계 거리와 평균 역 사이 거리를 계산.
  • 출력 컬럼명:
    • TOTAL_DISTANCE: 노선의 총 누계 거리 (소수점 둘째 자리 반올림 후 "km" 추가).
    • AVERAGE_DISTANCE: 노선의 평균 역 사이 거리 (소수점 셋째 자리 반올림 후 "km" 추가).
  • 총 누계 거리(TOTAL_DISTANCE) 기준 내림차순 정렬.

예시 실행 결과

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

문제풀이


[SQL 문제 풀이] 서울 지하철 2호선 노선별 거리 조회


문제 요약

서울지하철 2호선의 SUBWAY_DISTANCE 테이블에서 노선별 총 누계 거리(TOTAL_DISTANCE)평균 역 사이 거리(AVERAGE_DISTANCE)를 계산하는 SQL문을 작성합니다.
결과는 소수점 자리수를 지정하여 반올림한 값 뒤에 단위(km)를 추가하고, 총 누계 거리 기준으로 내림차순 정렬합니다.


해결 과정
  1. 테이블 구조 이해
    SUBWAY_DISTANCE 테이블의 주요 정보:
    • ROUTE: 노선 이름.
    • D_BETWEEN_DIST: 역 사이 거리.
    • D_CUMULATIVE: 누적 거리 (노선별 전체 누계 거리 계산에 불필요).
  2. 요구사항 분석
    • 각 노선별로:
      • 총 누계 거리 = SUM(D_BETWEEN_DIST)
      • 평균 역 사이 거리 = AVG(D_BETWEEN_DIST)
    • 소수점 자리수 조정:
      • TOTAL_DISTANCE: 소수 둘째 자리에서 반올림.
      • AVERAGE_DISTANCE: 소수 셋째 자리에서 반올림.
    • 단위(km) 추가.
  3. SQL 작성
    • 집계 함수 SUMAVG를 사용해 그룹화.
    • ROUND 함수로 소수점 자리 조정.
    • GROUP BYORDER BY 사용으로 그룹화와 정렬.

최종 SQL 코드
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

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

오답 노트
  1. DISTANCE의 소수점 자리 조정 누락
    처음 작성한 SQL에서 ROUND 함수로 소수점 자리수를 반올림하지 않아 결과가 정확하지 않았습니다.
  2. GROUP BY와 ORDER BY 위치 문제
    GROUP BY를 지정하지 않아 집계 결과가 예상대로 나오지 않았습니다.
  3. 단위 추가 실수
    ROUND 뒤에 'km'를 추가하지 않아 요구사항을 충족하지 못했습니다.

배운 점
  • concat 함수를 사용하여 수치형과 문자열을 연결해 데이터를 가공할 수 있었다.
  • 그룹화된 데이터를 정렬하려면 ORDER BY에서 집계 함수와 정렬 기준을 명확히 지정해야 합니다.