-
<프로그래머스> 주문량이 많은 아이스크림 조회하기코딩테스트/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개 행을 조회한다.
'코딩테스트 > SQL 코딩테스트' 카테고리의 다른 글
<프로그래머스> 조건에 부합하는 중고거래 댓글 조회하기 (1) 2024.01.09 <프로그래머스> 저자 별 카테고리 별 매출액 집계하기 (0) 2023.12.28 <프로그래머스> 조회수가 가장 많은 중고거래 게시판 첨부파일 조회하기 (0) 2023.12.28 <프로그래머스> 우유와 요거트가 담긴 장바구니 (0) 2023.12.28 <프로그래머스> 헤비 유저가 소유한 장소 (0) 2023.12.28 - 문제 요구사항