mysql 문제풀이/easy

프로그래머스 Lv 4 - 주문량이 많은 아이스크림들 조회하기

gooreumsea 2023. 7. 10. 16:52

링크: https://gooreumwave.tistory.com/43

 

습득한 점: 

단순히 코드를 붙여넣기 하기보단

문제를 풀기 위해 생각했었던 중간과정을 기록해보는 것이
나중에 다시 복습할 때, 좋을 것 같음.

또한 다음부턴 쿼리 작성 시간도 카운트 해보면 좋을 것 같다.

 

(쿼리 작성 속도가 점점 더 빨라지는 것 같아서 다행이다)

 

 

문제:

 

 

 

문제파악:

 

JULY 테이블의 strawberry 값이 2개 값으로 표출되어

FLAVOR 컬럼 기준으로 누적합 함수를 쓰면 풀 수 있지 않을까 했지만, 순간의 착각이었다.

FLAVOR 컬럼을 기준으로 누적합이 생성되는 것을 확인했다...

즉, JULY 테이블에서 한가지 맛을 거듭할때마다 아래 예시 처럼 CUM_SUM 컬럼에 누적합이 더해졌었다.

 

ex)

SHIPMENT_ID FLAVOR TOTAL_ORDER CUM_SUM
1 딸기 30 30
2 메론 40 70
3 사과 10 80
4 사과 20 100
5 수박 30 130

 

 

문제에서 원하는 부분은

출하번호는 다르지만, 같은 맛인 사과에 대한 TOTAL_ORDER만 합치고, 나머지 과일은 그대로 두면 되었었다.

 

그래서, 방법을 바꾸어 SELECT 문에 FLAVOR 별 그룹 합계를 구하고

FIRST_HALF 절과 INNER JOIN 이후에 이를 활용테이블로 삼아 합계 상위 3개만 뽑아냈다.

 

 

 

풀이:

 

1. JULY 테이블의 경우, 출하량이 많아 같은 맛의 아이스크림이라도 다른 출하번호를 갖게된다고 명시되어 있어서,
쿼리를 작성하기 전 이 부분을 직접 확인

 

SELECT COUNT(FLAVOR) = 7
FROM FIRST_HALF

 

SELECT COUNT(DISTINCT FLAVOR) = 7
FROM FIRST_HALF

SELECT COUNT(FLAVOR) = 8
FROM JULY

 

2. JULY 테이블에만 중복된 값(JULY 테이블의 딸기만 SHIPMENT_ID 가 2개)이 존재함을 파악할 수 있었고,
이 테이블에 대하여 그룹별 합계를 계산하고 이를 테이블로 활용하기 위해 WITH 문으로 감쌌다.

** FROM 절 or WITH 절 중 아무거나 사용해도 될 것 같음.


WITH COUNTER AS (
        SELECT FLAVOR
             , SUM(TOTAL_ORDER ) AS TOTAL_JULY
        FROM JULY
        GROUP BY FLAVOR
                )                           


3. 다음으로 새로 생성한 테이블에 FLAVOR 기준으로 FIRST_HALF를 조인했다.

 

이 과정에서 SELECT 문에 그룹별 FLAVOR 총 주문량이 합쳐진 컬럼이 필요했고,

SUM(TOTAL_JULY+TOTAL_ORDER) AS TOTAL_SUM 로 처리했다.

 

다시금 FLAVOR 별로 묶어 준 뒤, 총 주문량 기준으로 내림차순으로 정렬했고,

상위 3개의 총 주문량의 데이터만 나올 수 있도록 LIMIT 을 조정했다.


SELECT FIRST_HALF.FLAVOR
     , SUM(TOTAL_JULY+TOTAL_ORDER) AS TOTAL_SUM
FROM FIRST_HALF
     INNER JOIN COUNTER ON COUNTER.FLAVOR = FIRST_HALF.FLAVOR
GROUP BY FIRST_HALF.FLAVOR     
ORDER BY TOTAL_SUM DESC    # 내림차순
LIMIT 3

 

 

4. 문제에서 원하는 컬럼은 오직 FLAVOR 컬럼이었기에, TOTAL_SUM을 지우니 내림차순이 적용이 되지 않았다.

(정렬기준의 컬럼이 사라져 버리니까)

 

해서, 이를 다시 서브쿼리문으로 재활용하기 위해 괄호로 묶어서 FROM 절의 괄호에 넣었다.

 

풀이:

 

SELECT FLAVOR
FROM ( 
    
        WITH COUNTER AS (
                SELECT FLAVOR
                     , SUM(TOTAL_ORDER ) AS TOTAL_JULY
                FROM JULY
                GROUP BY FLAVOR
                        )                              

        SELECT FIRST_HALF.FLAVOR
             , SUM(TOTAL_JULY+TOTAL_ORDER) AS TOTAL_SUM
        FROM FIRST_HALF
             INNER JOIN COUNTER ON COUNTER.FLAVOR = FIRST_HALF.FLAVOR
        GROUP BY FIRST_HALF.FLAVOR     
        ORDER BY TOTAL_SUM DESC    # 내림차순
        LIMIT 3    

    )sub