코딩테스트/SQL 코딩테스트

<프로그래머스> 주문량이 많은 아이스크림 조회하기

배또가또 2023. 12. 28. 19:55

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

 

프로그래머스

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

programmers.co.kr



  • 문제 요구사항
    • 7월에 아이스크림 총 주문량과 상반기 아이스크림 총 주문량을 더한 값이 큰 순서대로
    • 상위 3개의 맛을 조회하는 SQL문을 작성

FIRST_HALF테이블은 이미 집계가 된 테이블이고 JULY 테이블은 집계되지 않은 데이터이다. 

따라서 두 가지 접근이 가능하다고 봤다.

 

첫번째는 JULY 테이블을 집계처리를 한 뒤 내부 조인을 하는 것이다. 

두 번째는 외부 조인을 해서 데이터를 합췬 뒤에 집계를 하는 것이다. 

 

Oracle에서는 GROUP BY절을 쓸 때 집계함수가 없는 칼럼에 대해서 전부 GROUP BY 절에 넣어주어야하고 

GROUP BY로 집계함과 동시에 수식처리를 하면 에러가 발생했기 때문에 JULY 테이블을 집계처리를 먼저 진행했고

MySQL의 경우에는 위의 구문이 에러가 나지 않았기 때문에 외부조인을 한 뒤에 집계하는 방식으로 처리를 했다.


1) Oracle

SELECT FLAVOR
FROM 
(
    SELECT H.FLAVOR, 
           H.TOTAL_ORDER + J.TOTAL_ORDER AS SUM_ORDER 
    FROM FIRST_HALF H INNER JOIN (SELECT FLAVOR,
                                         SUM(TOTAL_ORDER) AS TOTAL_ORDER
                                  FROM JULY 
                                  GROUP BY FLAVOR) J ON H.FLAVOR = J.FLAVOR
    ORDER BY H.TOTAL_ORDER + J.TOTAL_ORDER DESC
)
WHERE ROWNUM <= 3

 

JULY 테이블에서 FLAVOR를 기준으로 TOTAL_ORDER를 집계한 뒤 FIRST_HALF와 FLAVOR를 기준으로 INNER JOIN하고 총 주문량을 두 주문량을 합산하여 계산한다. 그리고 합산한 주문량을 기준으로 내림차순 정렬한 데이터를 

FROM절 서브쿼리로 하여 FLAVOR를 조회하는데, ROWNUM이 3보다 작거나 같은 행 즉 상위 3개의 행에 대해 조회한다.


2) MySQL

SELECT FLAVOR
FROM 
(
    SELECT J.FLAVOR, 
           H.TOTAL_ORDER + SUM(J.TOTAL_ORDER) SUM_OF_ORDER
    FROM FIRST_HALF H RIGHT OUTER JOIN JULY J ON H.SHIPMENT_ID = J.SHIPMENT_ID
    GROUP BY J.FLAVOR
) A
ORDER BY SUM_OF_ORDER DESC
LIMIT 3;

 

MySQL에서는 GROUP BY와 동시에 집계한 데이터칼럼을 수식에 집어넣어도 에러가 나지 않아서

위와 같이 코드를 작성했다. 

 

FIRST_HALF 테이블에 JULY테이블을 SHIPMENT_ID를 기준으로 RIGHT OUTER JOIN을 했다. 

FIRST_HALF에는 존재하지 않는 SHIPMENT_ID의 경우에는 NULL값으로 대체된다.

그리고 이렇게 조인한 데이터에서 FIRST_HALF의 TOTAL_ORDER에  FLAVOR를 기준으로 합집계한 JULY의 TOTAL_ORDER를 더해 총 주문량 데이터를 조회하고 

이렇게 조회한 데이터를 FROM절 서브쿼리로 하고 총 주문량 기준 내림차순 정렬 한 뒤 

LIMIT 구문으로 맛 3개만 출력하는 것으로 상위 3개 행을 조회한다.