PRODUCT테이블에서 만원 단위의 가격대 별로 상품 개수를 출력하는 SQL 문을 작성해주세요. 이때 컬럼명은 각각 컬럼명은 PRICE_GROUP, PRODUCTS로 지정해주시고 가격대 정보는 각 구간의 최소금액(10,000원 이상 ~ 20,000 미만인 구간인 경우 10,000)으로 표시해주세요. 결과는 가격대를 기준으로 오름차순 정렬해주세요.
# 만원 단위의 가격대 별로 상품 개수를 출력
# 가격대 정보는 각 구간의 최소금액
# 가격대를 기준으로 오름차순 정렬
SELECT IF(PRICE < 10000, 0, CONCAT(SUBSTR(PRICE, 1, 1), '0000')) AS PRICE_GROUP, COUNT(PRODUCT_ID) AS PRODUCTS
FROM PRODUCT
GROUP BY PRICE_GROUP
ORDER BY PRICE_GROUP;
문제를 푼지 시간이 지나고 다시 보니, 내가 생각해도 저렇게 푼게 내 자신이 신기하다(역시 과거의 나는 타인이었어...) 그 때는 시간제한을 두고 풀었으니 어떻게든 푸는데 초점을 두다보니 그런 거 같다.
PRICE_GROUP: 문제를 풀 당시 물건의 최대가격이 80000원이라는 사실을 확인하고, IF문을 만들 때 만 원 미만의 상품에 대해서는 0으로 처리하고, 만원 이상이 상품에 대해서는 가장 앞자리에 있는 문자를 추출해 0을 4개 붙여주는 방식을 취했다. 여기서 CONCAT과 SUBSTR을 사용했는데, 당시 기록을 보니 두 함수가 기억이 나지 않아 지난 문제들을 참고해서 풀었다.
다른 분들의 답과 비교해보니 그 분들의 답안이 더 범용적인 것 같아 적어본다. 다음에 다른 문제를 풀 때 참고하면 좋을 거 같다.
# PRICE를 끝에서 4번째 자리까지 절삭
SELECT CASE WHEN PRICE < 10000 THEN 0
ELSE TRUNCATE (PRICE, -4) END AS PRICE_GROUP
# PRICE를 10000으로 나눈 뒤, FLOOR()을 사용하여 결과값보다 크지 않는 정수 반환
SELECT FLOOR(PRICE/10000)*10000 AS PRICE_GROUP
# 같은 방법: SELECT FLOOR(PRICE*0.0001)*10000 AS PRICE_GROUP
SELECT문에 있는 ALIAS를 GROUP BY문에서도 사용할 수 있다는 사실을 알게되었다. 이에 대해 어떻게 GROUP BY문에서도 SELECT에 있는 ALIAS를 사용할 수 있는지를 GPT에게 물어봤더니 다음과 같이 정리해주었다.
ALIAS 사용 가능 여부| 절 | ALIAS 사용 가능 여부 | 이유 |
|---|---|---|
WHERE | ❌ 불가능 | WHERE은 SELECT보다 먼저 실행되므로, ALIAS를 참조할 수 없음. |
GROUP BY | ⭕ 일부 DBMS에서는 가능 | MySQL은 최적화를 통해 ALIAS 사용을 허용. 하지만 표준 SQL은 불가. |
HAVING | ⭕ 일부 DBMS에서는 가능 | MySQL에서는 ALIAS를 허용하지만, 표준 SQL에서는 원래 컬럼명을 사용해야 함. |
ORDER BY | ⭕ 가능 | ORDER BY는 SELECT 이후에 실행되므로 ALIAS를 사용할 수 있음. |
➡ 결론: ORDER BY에서는 100% 가능, GROUP BY와 HAVING은 MySQL에서는 가능하지만 표준 SQL에서는 불가능할 수도 있음.
➡ WHERE에서는 절대 사용할 수 없음!