링크: https://gooreumwave.tistory.com/43
습득한 점:
단순히 코드를 붙여넣기 하기보단
문제를 풀기 위해 생각했었던 중간과정을 기록해보는 것이
나중에 다시 복습할 때, 좋을 것 같음.
또한 다음부턴 쿼리 작성 시간도 카운트 해보면 좋을 것 같다.
(쿼리 작성 속도가 점점 더 빨라지는 것 같아서 다행이다)
문제:
문제파악:
JULY 테이블의 strawberry 값이 2개 값으로 표출되어
FLAVOR 컬럼 기준으로 누적합 함수를 쓰면 풀 수 있지 않을까 했지만, 순간의 착각이었다.
FLAVOR 컬럼을 기준으로 누적합이 생성되는 것을 확인했다...
즉, JULY 테이블에서 한가지 맛을 거듭할때마다 아래 예시 처럼 CUM_SUM 컬럼에 누적합이 더해졌었다.
ex)
SHIPMENT_ID | FLAVOR | TOTAL_ORDER | CUM_SUM |
1 | 딸기 | 30 | 30 |
2 | 메론 | 40 | 70 |
3 | 사과 | 10 | 80 |
4 | 사과 | 20 | 100 |
5 | 수박 | 30 | 130 |
문제에서 원하는 부분은
출하번호는 다르지만, 같은 맛인 사과에 대한 TOTAL_ORDER만 합치고, 나머지 과일은 그대로 두면 되었었다.
그래서, 방법을 바꾸어 SELECT 문에 FLAVOR 별 그룹 합계를 구하고
FIRST_HALF 절과 INNER JOIN 이후에 이를 활용테이블로 삼아 합계 상위 3개만 뽑아냈다.
풀이:
1. JULY 테이블의 경우, 출하량이 많아 같은 맛의 아이스크림이라도 다른 출하번호를 갖게된다고 명시되어 있어서,
쿼리를 작성하기 전 이 부분을 직접 확인
SELECT COUNT(FLAVOR) = 7
FROM FIRST_HALF
SELECT COUNT(DISTINCT FLAVOR) = 7
FROM FIRST_HALF
SELECT COUNT(FLAVOR) = 8
FROM JULY
2. JULY 테이블에만 중복된 값(JULY 테이블의 딸기만 SHIPMENT_ID 가 2개)이 존재함을 파악할 수 있었고,
이 테이블에 대하여 그룹별 합계를 계산하고 이를 테이블로 활용하기 위해 WITH 문으로 감쌌다.
** FROM 절 or WITH 절 중 아무거나 사용해도 될 것 같음.
WITH COUNTER AS (
SELECT FLAVOR
, SUM(TOTAL_ORDER ) AS TOTAL_JULY
FROM JULY
GROUP BY FLAVOR
)
3. 다음으로 새로 생성한 테이블에 FLAVOR 기준으로 FIRST_HALF를 조인했다.
이 과정에서 SELECT 문에 그룹별 FLAVOR 총 주문량이 합쳐진 컬럼이 필요했고,
SUM(TOTAL_JULY+TOTAL_ORDER) AS TOTAL_SUM 로 처리했다.
다시금 FLAVOR 별로 묶어 준 뒤, 총 주문량 기준으로 내림차순으로 정렬했고,
상위 3개의 총 주문량의 데이터만 나올 수 있도록 LIMIT 을 조정했다.
SELECT FIRST_HALF.FLAVOR
, SUM(TOTAL_JULY+TOTAL_ORDER) AS TOTAL_SUM
FROM FIRST_HALF
INNER JOIN COUNTER ON COUNTER.FLAVOR = FIRST_HALF.FLAVOR
GROUP BY FIRST_HALF.FLAVOR
ORDER BY TOTAL_SUM DESC # 내림차순
LIMIT 3
4. 문제에서 원하는 컬럼은 오직 FLAVOR 컬럼이었기에, TOTAL_SUM을 지우니 내림차순이 적용이 되지 않았다.
(정렬기준의 컬럼이 사라져 버리니까)
해서, 이를 다시 서브쿼리문으로 재활용하기 위해 괄호로 묶어서 FROM 절의 괄호에 넣었다.
풀이:
SELECT FLAVOR
FROM (
WITH COUNTER AS (
SELECT FLAVOR
, SUM(TOTAL_ORDER ) AS TOTAL_JULY
FROM JULY
GROUP BY FLAVOR
)
SELECT FIRST_HALF.FLAVOR
, SUM(TOTAL_JULY+TOTAL_ORDER) AS TOTAL_SUM
FROM FIRST_HALF
INNER JOIN COUNTER ON COUNTER.FLAVOR = FIRST_HALF.FLAVOR
GROUP BY FIRST_HALF.FLAVOR
ORDER BY TOTAL_SUM DESC # 내림차순
LIMIT 3
)sub
'sql > easy' 카테고리의 다른 글
프로그래머스 Lv 4 - 서울에 위치한 식당 목록 출력하기 (0) | 2023.07.14 |
---|---|
프로그래머스 Lv 4 - 년, 월, 성별 별 상품 구매 회원 수 구하기 (0) | 2023.07.14 |
프로그래머스 Lv 4 - 우유와 요거트가 담긴 장바구니 - Summer/Winter Coding(2019) (0) | 2023.07.09 |
프로그래머스 Lv 4 - 저자 별 카테고리 별 매출액 집계하기 (0) | 2023.07.09 |
프로그래머스 Lv 3 - 2021 Dev-Matching: 웹 백엔드 개발자(상반기) 헤비 유저가 소유한 장소 (0) | 2023.07.03 |