쿼리를 작성할 때 정렬(ORDER BY) 단계에서 주의해야 할 점이 있다. 다음 문제를 보자.
https://school.programmers.co.kr/learn/courses/30/lessons/284531
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
이 문제는 데이터를 노선(ROUTE)별로 그룹화하여 합계와 평균을 구하는 집계 능력, 그리고 숫자 데이터에 반올림과 단위(km)를 붙이는 가공 능력을 동시에 요구한다.
이때 컬럼에 'km'라는 문자를 붙여버리면 컴퓨터는 이를 숫자가 아닌 문자열로 인식하여 정렬 결과가 꼬일 수 있다.
따라서 다음과 같이 쿼리를 작성하면 틀렸다는 결과를 얻는다.
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
TOTAL_DISTANCE DESC
이렇게 별칭을 기준으로 정렬을 하게 되면 데이터베이스는 문자열 정렬 기준에 따라 '10km'보다 '9km'가 크다고 판단할 수 있다.
따라서 문자가 붙기 전의 순수한 합계 수치인 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
'DB' 카테고리의 다른 글
| [DB] 트랜잭션 (Transaction) – ACID 속성, 트랜잭션 격리 수준 (0) | 2025.09.22 |
|---|---|
| [DB] 데이터 무결성 (Data Integrity), 제약 조건 (Constraints) (0) | 2025.09.21 |
| [DB] 인덱스 (Index) (2) | 2025.09.21 |
| [DB] 뷰 (VIEW) (1) | 2025.09.19 |
| [DB] CASE 문 (0) | 2025.09.19 |