WITH TT as (SELECT h.FLAVOR, h.TOTAL_ORDER + sum(j.TOTAL_ORDER) as T
FROM FIRST_HALF as h , JULY as j
WHERE h.FLAVOR = j.FLAVOR
GROUP BY 1
ORDER BY 2 desc
limit 3)
SELECT t.FLAVOR
FROM FIRST_HALF as h, TT as t
WHERE t.FLAVOR = h.FLAVOR
ORDER BY T desc
문제
7월 아이스크림 총 주문량과 상반기의 아이스크림 총 주문량을 더한 값이 큰 순서대로 상위 3개의 맛을 조회하는 SQL 문을 작성
ORDER BY절에서 집계함수 써서 정렬 하는 방법도 다음엔 써봐야겠다는 생각을(만) 하며 기본만 하자는 생각으로 기본적인 방법으로 풀었다.
1차적으로 WHERE 조건에서 서브쿼리를 돌려 사용해 보려했지만 limit 함수가 먹히지 않아 중간에 With 절로 변경하였다.Mysql에선 지원이 되지 않는다는 문구가 뜬다..
일단 limit, order by를 빼기 귀찮아 한번에 다 With에 넣고 메인쿼리는 짧게 구성하였다. With절에 보면 먼저 JULY 테이블과 FIRST_HALF 테이블을 조인해준다. 그후 GROUP BY를 FLAVOR 기준으로 하고 7월과 상반기 ORDER의 합을 구해줘야하는데 여기서 주의 할 점은 맛을 기준으로 그룹이 되었다는 점이다. 문제 내용을 보면 7월에는 아이스크림 주문량이 많아 같은 아이스크림에 대하여 서로 다른 두 공장에서 아이스크림 가게로 출하를 진행하는 경우가 있습니다. 이 경우 같은 맛의 아이스크림이라도 다른 출하 번호를 갖게 됩니다.
라고하여 7월 에 맛 기준으로 그룹해버렸을때 문제가 되는 또다른 기준 조건인 아이스크림 공장 이 생겨버렸다. 따라서 이 값도 같이 고려해 주어야 해서 7월 총 ORDER인 j.TOTAL_ORDER 는 그룹된 값에 처리되기전에 합하는 SUM()으로 묶어서 처리해 주었다. 그렇게 하지않으면 GROUP BY를 하면서 다른 기준에 있던 행의 값은 사라져 버려 오류가 나기때문이다.그렇게 맛을 기준으로 GROUP BY 처리도 해준 뒤 TOTAL ORDER 가 큰순서대로 정렬 하여 상위 3개 값을 limit 처리하였다.
이러면 7월 아이스크림 총 주문량과 상반기의 아이스크림 총 주문량을 더한 값이 큰 순서대로 상위 3개의 맛을 조회 하는 서브 쿼리가 만들어진다.
이렇게 만들어 진 서브쿼리를 기존의 아무쿼리와 FLAVOR을 기준으로 조인 시켜주면 서브쿼리에 있는 3개의 값만 걸러져서 메인쿼리와 inner join 되어 값을 뽑아낼 수 있다. 그 후 서브쿼리의 TOTAL ORDER값을 의미하는 T로 정렬을 해주어 마무리한다.
'SQL > MY SQL 문제 풀이(프로그래머스)' 카테고리의 다른 글
[MYSQL] PROGRAMMERS_오프라인/온라인 판매 데이터 통합하기 (0) | 2024.02.24 |
---|---|
[MYSQL] PROGRAMMERS_그룹별 조건에 맞는 식당 목록 출력하기 (0) | 2024.02.24 |
[MYSQL] PROGRAMMERS_우유와 요거트가 담긴 장바구니 (0) | 2024.02.23 |
[MYSQL] PROGRAMMERS_저자 별 카테고리 별 매출액 집계하기 (0) | 2024.02.23 |
[MYSQL] PROGRAMMERS_년, 월, 성별 별 상품 구매 회원 수 구하기 (0) | 2024.02.23 |