아이스크림 가게의 상반기 주문 정보를 담은 FIRST_HALF 테이블과 7월의 아이스크림 주문 정보를 담은 JULY 테이블입니다.
FIRST_HALF 테이블 구조는 다음과 같으며, SHIPMENT_ID, FLAVOR, TOTAL_ORDER는 각각 아이스크림 공장에서 아이스크림 가게까지의 출하 번호, 아이스크림 맛, 상반기 아이스크림 총주문량을 나타냅니다. FIRST_HALF 테이블의 기본 키는 FLAVOR입니다.
FIRST_HALF테이블의 SHIPMENT_ID는 JULY테이블의 SHIPMENT_ID의 외래 키입니다.
<first_half 테이블>
JULY 테이블 구조는 다음과 같으며, SHIPMENT_ID, FLAVOR, TOTAL_ORDER 은 각각 아이스크림 공장에서 아이스크림 가게까지의 출하 번호, 아이스크림 맛, 7월 아이스크림 총주문량을 나타냅니다. JULY테이블의 기본 키는 SHIPMENT_ID입니다. JULY테이블의
FLAVOR는 FIRST_HALF 테이블의 FLAVOR의 외래 키입니다. 7월에는 아이스크림 주문량이 많아 같은 아이스크림에 대하여 서로 다른
두 공장에서 아이스크림 가게로 출하를 진행하는 경우가 있습니다. 이 경우 같은 맛의 아이스크림이라도 다른 출하 번호를 갖게 됩니다.
<july 테이블>
<문제>
7월 아이스크림 총 주문량과 상반기의 아이스크림 총 주문량을 더한 값이 큰 순서대로 상위 3개의 맛을 조회하는 SQL 문을 작성해주세요.
<나의 잘못된 풀이>
select f.flavor,
sum(j.total_order) + sum(f.total_order)
from first_half f inner join july j on f.shipment_id=j.shipment_id
group by f.shipment_id
order by sum(j.total_order) + sum(f.total_order) desc
limit 3
실행결과가 나오긴 한다 .... 점점 SQL 문제가 어려워지고 내가 기억하고 있는 함수들로 응용이 잘 안된다 ...
일단 생각나는대로 이것저것 쳐보긴 했지만 결과적으론 틀린 답이다 ^^ ....
애초에 flavor만 답으로 나와야했고 아마 이것말고도 틀린 부분이 있을 것이다.
테이블 두개가 똑같이 생겼으니 union을 쓰면 되나 싶었지만 잘 몰라서 조인문으로 작성한건데 union으로 다시 도전
<최종 풀이>
select flavor
from
(
select flavor,
sum(total_order) total_order
from
(
select *
from first_half
union
select *
from july
) a
group by flavor
order by total_order desc
limit 3
) b
결과는 정답! !
union 과 적절하게 서브쿼리를 이용해야 하는 문제였다.
<풀이>
1. union 결합 + 1차적인 서브쿼리 a 만들어주기
(
select *
from first_half
union
select *
from july
) a
union을 해줌으로써 두 개의 테이블을 결합을 해주고 이것을 가지고 정답을 낼 수 없기 때문에 서브쿼리 a로 만들어준다.
2. 서브쿼리 b 만들어주기
1) 유니온 문으로 결합했던 결과물에서 flavor와 가져와주고 total_order를 sum 해준다(문제에서 월 아이스크림 총 주문량과 상반기의 아이스크림 총 주문량을 더한 값을 구해야 하기 때문)
--> select flavor, sum(total_order) total_order
2) flavor로 그룹화를 해주고 문제에서 총 주문량을 더한 값이 큰 순서대로 상위 3개의 맛을 조회하라고 돼 있었기 때문에 total_order를 내림차순으로 order by 해주고 상위 3개까지만 보여야 하기 때문에 limit을 사용
--> group by flavor
order by total_order desc
limit. 3
3) 마지막으로 다시 b로 서브쿼리를 감싸준다 (이유? 결과값에선 flavor만 나와야 하는데 이대로두면 flavor와 total_order 같이 나오기 때문)
(
select flavor,
sum(total_order) total_order
from
(
select *
from first_half
union
select *
from july
) a
group by flavor
order by total_order desc
limit 3
) b
3. 마지막으로 select에 flavor만 넣어줌으로써 결과값이 잘 나올 수 있게 해줌!
'CODEKATA' 카테고리의 다른 글
[Python] 없는 숫자 더하기 (0) | 2024.08.01 |
---|---|
[MySQL] 저자 별 카테고리 별 매출액 집계하기 (0) | 2024.07.31 |
[MySQL] 조회수가 가장 많은 중고거래 게시판의 첨부파일 조회하기 (0) | 2024.07.25 |
[Python] 핸드폰 번호 가리기 (0) | 2024.07.22 |
[MySQL] 헤비 유저가 소유한 장소 (0) | 2024.07.22 |