https://school.programmers.co.kr/learn/courses/30/lessons/131530
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
코드
SELECT (CASE WHEN PRICE < 10000 THEN 0
ELSE TRUNCATE(PRICE, -4) END) AS PRICE_GROUP, COUNT(*) AS PRODUCTS
FROM PRODUCT
GROUP BY PRICE_GROUP
ORDER BY PRICE_GROUP
쿼리 실행 순서 요약
- FROM → PRODUCT 테이블에서 데이터 로드
- CASE 문 실행 → PRICE_GROUP 값을 결정
- GROUP BY → PRICE_GROUP 별로 그룹화
- COUNT 계산 → 그룹별 PRODUCT_ID 개수 카운트
- SELECT → 최종 컬럼 선택 (PRICE_GROUP, PRODUCTS)
- ORDER BY → PRICE_GROUP 기준으로 정렬
CASE 문이 PRICE_GROUP을 가공하는 역할을 한다고 보면 됩니다.
CASE 문은 SELECT 절 안에서 실행되지만, 실제로 GROUP BY에서 사용되므로 MySQL은 GROUP BY가 실행되기 전에 CASE 문을 평가해서 각 행에 대해 PRICE_GROUP 값을 생성해야 합니다..
즉, 실행 순서에서 보면 CASE 문이 FROM에서 가져온 원본 데이터의 PRICE 값을 가공해서 새로운 PRICE_GROUP 값을 만들고, 이 값으로 GROUP BY를 수행해야 합니다.
핵심 흐름:
- 원본 PRICE 데이터를 가져옴 (FROM)
- CASE 문으로 PRICE_GROUP 값 생성
- PRICE_GROUP 기준으로 그룹화 (GROUP BY)
- 그룹별 COUNT(PRODUCT_ID) 수행
- 최종 SELECT 실행
- PRICE_GROUP 기준 정렬 (ORDER BY)
그래서 CASE 문이 단순히 SELECT 결과를 변형하는 게 아니라, GROUP BY에서 사용할 "그룹 키"를 생성하는 역할을 한다고 보면 됩니다.
셀프 테스트
데이터 가공이 필요하다면?
- CASE를 사용해보자
TRUNCATE()란?
- number: 잘라낼 숫자
- decimal_places: 유지할 소수점 이하 자리수 (음수면 정수 자릿수를 자름)
SELECT TRUNCATE(123.456, 2); -- 123.45
SELECT TRUNCATE(123.456, 0); -- 123
SELECT TRUNCATE(123.456, -1); -- 120
SELECT TRUNCATE(123.456, -2); -- 100
ROUND() vs TRUNCATE() 차이
ROUND(123.456, 2) | 반올림 | 123.46 |
TRUNCATE(123.456, 2) | 잘라내기 | 123.45 |
ROUND(123.456, -1) | 1의 자리 반올림 | 120 |
TRUNCATE(123.456, -1) | 1의 자리 버림 | 120 |
- ROUND()는 반올림 (올라갈 수도 있음)
- TRUNCATE()는 버림 (무조건 잘라냄)
'프로그래머스' 카테고리의 다른 글
[프로그래머스 SQL] 입양 시각 구하기(1) - 쿼리 실행 순서와 함께 보자 (0) | 2025.03.02 |
---|---|
[프로그래머스 SQL] CASE와 WHERE 차이점과 용도 (0) | 2025.03.02 |
[프로그래머스][SQL] 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 (0) | 2024.06.09 |
[프로그래머스][SQL] 성분으로 구분한 아이스크림 총 주문량 (0) | 2024.06.08 |
[프로스래머스][Python] 순위 - 코팩 (0) | 2024.01.15 |