문제
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) 으로 축약 가능(단, 컬럼 이름이 두 테이블에서 동일하지 않다면 사용할 수 없다.)
'SQL' 카테고리의 다른 글
| [SQL/코드카타] 프로그래머스 : 저자 별 카테고리 별 매출액 집계하기 | WITH, JOIN, GROUP BY (1) | 2025.09.17 |
|---|---|
| [SQL/코드카타] 프로그래머스 64번 - 헤비유저가 소유한 장소 (0) | 2025.09.12 |
| [SQL/코드카타] 프로그래머스 62번 - 자동차 대여 기록에서 장기/단기 대여 구분하기 (0) | 2025.09.04 |