https://school.programmers.co.kr/learn/courses/30/lessons/133027
문제 예시
FIRST_HALF 테이블
JULY 테이블
원하는 출력값
7월 아이스크림의 총주문량과 상반기 아이스크림의 총 주문량을 더한 값이 큰 순서대로 상위 3개
<🥲‼️ 잘못된 풀이 ‼️ 아래로 가세용>
FLAVOR값을 선택해준다.
우리는 주문량의 합이 큰 값을 찾아주어야 한다.
이해를 위해 임의로 7월의 총주문량과 상반기의 총 주문량을 더한 값을 함께 출력해보았다.
SELECT
J.FLAVOR,
(SUM(J.TOTAL_ORDER) + SUM(F.TOTAL_ORDER)) AS TOTAL_ORDER
FROM FIRST_HALF AS F
JOIN JULY AS J
ON F.FLAVOR = J.FLAVOR
GROUP BY F.FLAVOR
ORDER BY TOTAL_ORDER DESC
LIMIT 3;
위의 코드를 출력하면
이런 결과가 나온다.
GROUP BY FLABOR로 묶어주었기 때문에 FLAVOR는 한 종류만 나오게 된다.
상위 3개만 뽑고 싶기 때문에, LIMIT 3을 해주면 된다!
SELECT
F.FLAVOR
FROM FIRST_HALF AS F
JOIN JULY AS J
ON F.FLAVOR = J.FLAVOR
GROUP BY F.FLAVOR
ORDER BY (SUM(J.TOTAL_ORDER) + SUM(F.TOTAL_ORDER)) DESC
LIMIT 3;
취준 때 급하게 쿼리 공부하면서 풀었던 문젠데 요즘 쿼리문 공부하시는 분들이 많으신지 해당 문제로 유입되는 분들이 많았다.
그래서 그런지댓글로 누가 위의 합이 잘못된것같다고알려주셔서 다시 문제를 보았다..
그런데 정말 잘못된것이다..?! 그와중에 프로그래머스에서 낸 정답이 여전히 정답처리가 되고 있었다.. 결과값만 맞으면 맞는건강..!?
새로운 풀이 시작합니다..^__^
📌 풀이 )
위의 방법이 틀린 이유는 INNER 조인을 하면서 strawberry 값이 JULY에는 2번 들어가고 있어, 상반기 값이 JOIN을 하면서 두번씩 더해져서 생긴 문제였다.
그래서 일단은 그 두 테이블을 합쳐서 하나의 테이블로 만들어보자!(일단 FLAVOR가 중복되어도 그냥 출력해보겠음)
SELECT
FLAVOR, TOTAL_ORDER FROM JULY
UNION ALL
SELECT FLAVOR, TOTAL_ORDER FROM FIRST_HALF
대략 이런식으로 나오게 된다.
그렇다면 다음부턴 쉽다.
combined_table을 그냥 FLAVOR별로 그룹을 묶어서 출력하면 된다.
SELECT FLAVOR, SUM(TOTAL_ORDER) AS TOTAL_ORDERS
FROM (
SELECT FLAVOR, TOTAL_ORDER FROM JULY
UNION ALL
SELECT FLAVOR, TOTAL_ORDER FROM FIRST_HALF
) AS combined_table
GROUP BY FLAVOR
ORDER BY TOTAL_ORDERS DESC;
정상적으로 중복없이 값이 더해진것을 볼 수 있다. 위의 잘못된 풀이와 다르게말이다..^^;;
이제 이 값들으로 정렬을 하여 세가지 FLAVOR만 뽑으면 끝이다.
정답 풀이 1
SELECT FLAVOR
FROM (
SELECT FLAVOR, SUM(TOTAL_ORDER) AS TOTAL_ORDERS
FROM (
SELECT FLAVOR, TOTAL_ORDER FROM JULY
UNION ALL
SELECT FLAVOR, TOTAL_ORDER FROM FIRST_HALF
) AS combined_table
GROUP BY FLAVOR
ORDER BY TOTAL_ORDERS DESC
) AS top_flavors
LIMIT 3;
그런데 뭔가 돌아온 기분이 든다.. 그냥 문제에서 말한거 그대로~ 정석적으로 풀었기 때문이다.
생각해보면, 상반기는 이미 그룹화가 진행된 테이블이고, JULY만 그룹화가 현재 진행이 되지않았기 때문에 JULY를 그룹화한 다음 상반기와 조인해주면 더 간단하게 풀 수 있다.(위의 틀린 풀이를 이용할 수 있다는 뜻)
코드는 아래와 같다.
정답 풀이 2
SELECT F.FLAVOR
FROM FIRST_HALF F
INNER JOIN (SELECT FLAVOR, sum(TOTAL_ORDER) AS JULY_TOTAL_ORDER
FROM JULY
GROUP BY FLAVOR) J
ON F.FLAVOR = J.FLAVOR
ORDER BY TOTAL_ORDER + JULY_TOTAL_ORDER DESC
LIMIT 3;
이너조인을 해주기 전에, JULY에서 그룹화를 먼저 진행하여 FLAVOR별로 저장되게 세팅을 해준다.
이제 J테이블에는 중복된 값이 나오지 않기때문에, 상반기와 JOIN해주어도 값이 중복으로 계산되지 않는다.
여전히 프로그래머스에서 위의 코드를 정답처리해주고있는데, 뭐 아무튼,, 위의 코드로 전체 출력을 해보면 좀 100%답은 아니지 않나 싶다..
아무튼 풀이 참고하시고 댓글 감사합니다!!!
'코테 공부 🔥' 카테고리의 다른 글
[프로그래머스/SQL] 오프라인/온라인 판매 데이터 통합하기 (0) | 2023.04.20 |
---|---|
[프로그래머스/SQL] 가격이 제일 비싼 식품의 정보 출력하기 (0) | 2023.04.20 |
[백준/파이썬] 15486: 퇴사 2 (0) | 2023.04.19 |
[백준/파이썬] 1041: 주사위 (1) | 2023.04.17 |
[백준/파이썬] 10942: 팰린드롬? (0) | 2023.04.17 |
댓글