일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- GA4
- SQLD
- jd
- 데이터 분석
- streamlit
- 크롤링
- 기초프로젝트
- 태블로
- 팀프로젝트
- 데이터분석
- data analyst
- da
- 히트맵
- lambda
- If
- 시각화
- pandas
- 최종 프로젝트
- 프로젝트
- 군집화
- Chat GPT
- 클러스터링
- SQL
- 프롬프트 엔지니어링
- Python
- 전처리
- cross join
- 기초통계
- 서브쿼리
- 머신러닝
- Today
- Total
세조목
SQL 예제 정리('주문량이 많은 아이스크림들 조회하기')(24.05.04) 본문
https://school.programmers.co.kr/learn/courses/30/lessons/133027
문제의 요구사항은 상반기와 7월의 FLAVOR별 총 주문량 합 TOP.3를 뽑는겁니다.
일단 상반기의 TOTAL_ORDER와 7월의 TOTAL_ORDER를 합해야 하는데
어떻게 합해야 할까요?
JOIN시키면 오른쪽으로 붙으니까 FLAVOR별 주문량 합계를 구할 수 없으니
아래쪽으로 붙여야겠습니다.
이 때 사용하는 기능이 'UNION'입니다.
UNION은 A테이블 아래쪽에 B테이블을 붙이는겁니다.
그렇다보니 A, B테이블은 컬럼의 수와 컬럼명이 동일해야합니다.
예를 들어 아래와 같은 두 개의 테이블을 UNION 시키면
아래와 같이 합쳐집니다.
SHIPMENT_ID | FLAVOR | TOTAL_ORDER |
101 | chocolate | 3200 |
101 | chocolate | 520 |
102 | vanilla | 2800 |
102 | vanilla | 560 |
103 | mint_chocolate | 1700 |
103 | mint_chocolate | 400 |
104 | caramel | 2600 |
104 | caramel | 460 |
105 | white_chocolate | 350 |
106 | peach | 500 |
SELECT MERGED_TABLE.FLAVOR, MERGED_TABLE.TOTAL_ORDER
FROM
(
SELECT *
FROM FIRST_HALF
UNION ALL
SELECT *
FROM JULY
) MERGED_TABLE
GROUP BY MERGED_TABLE.FLAVOR
HAVING SUM(MERGED_TABLE.TOTAL_ORDER)
ORDER BY SUM(MERGED_TABLE.TOTAL_ORDER) DESC
LIMIT 3;
서브쿼리에 UNION 시킨 테이블들을 넣주고,
본 쿼리에서 FLAVOR별 TOTAL_ORDER의 SUM을 구해준 후,
TOTAL_ORDER 순서대로 정렬된 결과값 中 3개만 LIMIT을 걸어주면 됩니다.
그런데 설명에서는 UINON이라고 했는데
왜 쿼리문에서는 UNION ALL을 쓴걸까요?
질문에 답하기위해서는 UNION과 UNION ALL의 차이점을 알고 있어야 하는데요,
UNION은 A테이블과 B테이블의 중복되는 값을 제거하지만
UNION ALL은 제거하지 않고 전부(ALL) 출력합니다.
문제에서의 경우 'FIRST_HALF' 테이블과 'JULY' 테이블에서 FLAVOR별로 중복되는 값이 없기 때문에
UNION을 쓰든 UNION ALL을 쓰든 상관없는 것입니다.
그리고 이 쿼리문에서 한 가지 더 짚고 넘어갈 점이 있습니다.
GROUP BY MERGED_TABLE.FLAVOR
HAVING SUM(MERGED_TABLE.TOTAL_ORDER)
ORDER BY SUM(MERGED_TABLE.TOTAL_ORDER) DESC
LIMIT 3;
저는 쿼리문을 작성할 때 GROUP BY로 GROUP화하고,
HAVING 절에서 TOTAL_ORDER를 SUM한 후,
ORDER BY 절에서 TOTAL_ORDER가 많은 순서대로 정렬했는데
사실 HAVING 절은 필요가 없습니다.
GROUP BY MERGED_TABLE.FLAVOR
ORDER BY SUM(MERGED_TABLE.TOTAL_ORDER) DESC
LIMIT 3;
이렇게 ORDER BY 절에서 집계함수를 사용할 수 있기 때문입니다.
ORDER BY 절에서도 집계함수를 사용할 수 있다는 점을 유념해야겠습니다.
'데이터 분석 공부 > SQL' 카테고리의 다른 글
SQL 예제 정리('대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기')(24.05.06) (0) | 2024.05.06 |
---|---|
SQL 예제 정리('그룹별 조건에 맞는 식당 목록 출력하기')(24.05.05) (0) | 2024.05.05 |
SQL 예제 정리('우유와 요거트가 담긴 장바구니')(24.05.03) (0) | 2024.05.03 |
SQL 예제 정리('자동차 대여 기록에서 대여 중/대여 가능 여부 구분하기') (0) | 2024.05.02 |
SQL 예제 정리('재구매가 일어난 상품과 회원 리스트 구하기') (1) | 2024.05.01 |