본문 바로가기
문제풀이/SQL(My sql)

[문제풀이] 주문량이 많은 아이스크림들 조회하기

by kime2 2024. 1. 29.
출처

 

문제

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

 

문제에 대한 해석

조회: 아이스크림 맛별 상반기 주문량과 7월 주문량의 함

정렬: 주문량이 높은 상위 3개의 맛

조건: 7월 아이스크림 맛별 shipment_id가 여러개

 

 

 

풀이(MYSQL)

select flavor
from 
(select f.flavor, (f.total_order+j.j_sales) as total
from first_half f
join (select flavor, sum(total_order) j_sales
from july 
group by flavor) j
on f.flavor = j.flavor
order by 2 desc)a
limit 3

 

작동순서

💡SQL 실행 순서는 From -> Where -> Group by -> Having -> Select -> Order by ->결과반환

  1. 서브쿼리1: july테이블에서 flavor별 total_order 합을 조회한다 -> 7월달의 맛별 총 주문량: j
  2. 서브쿼리2:  j테이블과 first_half을 flavor기준으로 inner join하고 flavor별 total_order 합을 조회하고 내림차순으로 정렬 -> 상반기 + 7월달의 맛별 총 주문량: a
  3. From 절: a테이블에서
  4. SELECT 절: flavor을 조회하는데
  5. ORDER BY 절: 3개까지만

 

다른사람 풀이

WITH BYJULY AS -- 4. BYJUL 임시테이블 작성
    ( SELECT * -- 2. 모든 데이터를
    FROM  FIRST_HALF  1. FIRST_HALF
    UNION DISTINCT -- 3. 중복된 데이터를 제거하고 세로(행별)로 합하여 
    SELECT * -- 2. 모든데이터를
    FROM JULY ) -- 1. JULY 테이블에서 
SELECT FLAVOR -- 7. FLAVOR 조회
FROM BYJULY -- 5. BYJUL 임시테이블 에서
GROUP BY FLAVOR -- 6. FLAVOR별로 그룹화하여
ORDER BY SUM(TOTAL_ORDER) desc --8. TOTAL_ORDER를 합한 내림차순
LIMIT 3; -- 9. 3개까지만
select mm.flavor --3. flavor조회
from july as mm
left join first_half as mv 
on mm.shipment_id = mv.shipment_id -- 1. july와 first_half를 shipment_id를 기준으로 조인 
group by mm.flavor -- 2. flavor으로 그룹화
order by sum(mm.total_order + ifnull(mv.total_order, 0)) desc limit 3
-- 4. 상반기 테이블에 없는 주문량은 ifnull을 통해 0으로 바꾼 뒤 7월달 주문량과 더하여 오름차순 후 3개만

배운점

  • union의 활용
  • order by에서 집계함수 사용