[SQL/코드카타] 프로그래머스 : 주문량이 많은 아이스크림 조회하기

문제

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

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 


✍️ 문제 요약

  • 7월 아이스크림 총 주문량(A)
  • 상반기의 아이스크림 총 주문량(B)
  • 각 주문량을 더 함(A + B)
  • 큰 순서대로 상위 3개의 맛 조회
  • 테이블 : 2개의 테이블 FIRST_HALF  / JULY  이며, 컬럼은 모두 동일하다.

✍️ 내가 작성한 쿼리

SELECT * 
FROM first_half
UNION ALL
SELET *
FROM july

🤔 테이블 형태를 보니 두 테이블의 컬럼이 동일하게 존재하고 있어서, 음,,, 그럼 세로로 병합하는 union (all)을 사용해보면 되겠다 싶어 위에 처럼 작성하였으나, 그럼 이후엔 어떻게 해야 하는거지? 상태에서 진도가 나가지 않았음.


🔍 정답 쿼리

SELECT t.flavor
FROM
(SELECT A.flavor, A.total_order
FROM first_half AS A
UNION ALL
SELECT B.flavor, B.total_order
FROM july AS B) t
GROUP BY t.flavor
HAVING SUM(t.total_order)
ORDER BY SUM(t.total_order) DESC
LIMIT 3;

 

🔥 쿼리 설명

1. 두 테이블의 컬럼이 모두 동일 ➡️ UNION (ALL) 사용

SELECT A.flavor, A.total_order
FROM first_half AS A
UNION ALL
SELECT B.flavor, B.total_order
FROM july AS B;

💡 union all로 결합한 테이블을 만들어 놓고 시작

 

2. 맛별로 주문량 합계 구하기

SELECT t.flavor
FROM
(...) t                       # ✅ 결합한 테이블(t)을 FROM 절에 놓고 풀이 시작
GROUP BY t.flavor             # 맛(flavor)별로
HAVING SUM(t.total_order)     # group by 후 집계함수 having 절 : 총 주문량 계산

 

3. 상위 3개 조회하기 ➡️ 내림차순 후, 상위 3개 

ORDER BY SUM(t.total_order) DESC       # 내림차순
LIMIT 3                                # 상위 3개

🔍 다른 풀이

1) 각각 총 주문량을 구하고 join 결합하여 합계구하기

select j.FLAVOR
from (
    select FLAVOR, sum(TOTAL_ORDER) as TOTAL_ORDER
    from JULY
    group by FLAVOR
) j
left join (
    select FLAVOR, sum(TOTAL_ORDER) as TOTAL_ORDER
    from FIRST_HALF
    group by FLAVOR
) fh
on j.FLAVOR = fh.FLAVOR
order by (j.TOTAL_ORDER + fh.TOTAL_ORDER) desc # ⭐️집계함수: select,having,order by에 사용 가능
limit 3;
📌 집계함수 : SELECT, HAVING, ORDER BY 절에서 사용 가능!
🫢 order by ( A + B ) 가능

 

2) 바로 LEFT JOIN 사용하여 결합 후 합계 구하기

SELECT flavor
FROM first_half f
LEFT JOIN july j 
USING (flavor)
GROUP BY flavor
ORDER BY SUM(f.total_order) + SUM(j.total_order) DESC
LIMIT 3;

LEFT JOIN 쓰는 이유

  • 사실 그냥 JOIN 사용하도 정답이 나옴
  • 하지만 상반기 테이블에 있는 flavor 인데 7월 테이블에 없는 flavor가 상위 3개인 경우를 놓칠 수 있음
  • 그리고 샘플 데이터 봤을 때 상반기 매출이 일반적으로 7월 한달보다 많음
  • MySQL은 FULL OUTER JOIN을 지원하지 않으므로 LEFT JOIN이 그나마 가장 안전한 것 같음

🥸 틈새 문법

SELECT *
FROM table1
JOIN table2
USING (컬럼명)

📌 USING : mysql에서 두 테이블의 조인할 컬럼명이 같을 때, USING(컬럼명)을 써서 더 간단히 표현 가능

즉, ON table1.col = table2.col → USING(col) 으로 축약 가능(단, 컬럼 이름이 두 테이블에서 동일하지 않다면 사용할 수 없다.)