SQL 강의에서 피봇 테이블에 관한 내용이 있었다.
서브쿼리를 통해 조인을 하고 그걸 다시 정리하는 내용.
이를 활용한 문제 하나를 해결하는 과제를 수행 중 이런 생각이 들었다.
"이런 문제에 서브쿼리를 쓰면 오히려 더 어렵게 하는 것이 아닐까?"
문제의 예시 답변으로 올라온 것은 다음과 같다.
SELECT
cuisine_type,
MAX(IF(ageGroup=10, order_count, 0)) "10대",
MAX(IF(ageGroup=20, order_count, 0)) "20대",
MAX(IF(ageGroup=30, order_count, 0)) "30대",
MAX(IF(ageGroup=40, order_count, 0)) "40대",
MAX(IF(ageGroup=50, order_count, 0)) "50대"
FROM
(
SELECT f.cuisine_type,
CASE
WHEN age BETWEEN 10 AND 19 THEN 10
WHEN age BETWEEN 20 AND 29 THEN 20
WHEN age BETWEEN 30 AND 39 THEN 30
WHEN age BETWEEN 40 AND 49 THEN 40
WHEN age BETWEEN 50 AND 59 THEN 50
END ageGroup,
COUNT(*) order_count
FROM food_orders f
JOIN customers c ON f.customer_id=c.customer_id
WHERE age BETWEEN 10 AND 59
GROUP BY f.cuisine_type, ageGroup
) AgeList
GROUP BY cuisine_type
답을 보고 더욱 확신했다. 서브쿼리를 쓸 필요가 없다고...
물론 서브쿼리에 대한 강의였기 때문에 의도한 부분이긴 하겠지만 맘에 안 드는 건 맘에 안 드는 거다.
난 서브쿼리를 제하고 다음과 같이 작성했다.
SELECT
f.cuisine_type,
SUM(CASE WHEN age BETWEEN 10 AND 19 THEN 1 ELSE 0 END) AS "10대",
SUM(CASE WHEN age BETWEEN 20 AND 29 THEN 1 ELSE 0 END) AS "20대",
SUM(CASE WHEN age BETWEEN 30 AND 39 THEN 1 ELSE 0 END) AS "30대",
SUM(CASE WHEN age BETWEEN 40 AND 49 THEN 1 ELSE 0 END) AS "40대",
SUM(CASE WHEN age BETWEEN 50 AND 59 THEN 1 ELSE 0 END) AS "50대"
FROM food_orders f
JOIN customers c ON f.customer_id = c.customer_id
WHERE age BETWEEN 10 AND 59
GROUP BY f.cuisine_type
솔직히 이게 더 알아보기 좋은 것 같다.
이 정도의 경우에 서브쿼리를 쓰는 것은 너무 과하다는 생각이 든다.
알아보기도 힘들어지고.
뭐든지 습관을 잘 들여야겠다는 생각이 든다.
'Camp > T.I.L.' 카테고리의 다른 글
[TIL #14] 정수 내림차순으로 배치하기 (0) | 2024.07.04 |
---|---|
[TIL #13] 정수 제곱근 판별 (0) | 2024.07.03 |
[TIL #11] 나머지가 1이 되는 수 찾기 (0) | 2024.07.01 |
[TIL #10] 자릿수 더하기 / 약수의 합 (0) | 2024.06.28 |
[TIL #9] 홀짝 구분 (0) | 2024.06.27 |