본문 바로가기
코테 공부 🔥

[프로그래머스/SQL] 주문량이 많은 아이스크림들 조회하기

by 서니서닝 2023. 4. 20.
728x90

https://school.programmers.co.kr/learn/courses/30/lessons/133027

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 예시

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는 한 종류만 나오게 된다.

(GROUP BY에 대한 이해를 돕기 위한 글)

 

상위 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%답은 아니지 않나 싶다.. 

아무튼 풀이 참고하시고 댓글 감사합니다!!!

728x90

댓글