링크: https://school.programmers.co.kr/learn/courses/30/lessons/131537
습득한 점:
* 컬럼의 값을 NULL 로 표시해야 할 경우에는, 문자열 "NULL" 나타내는 것이 아닌 NULL 로만 기재
* UNION , UNION ALL?
- UNION은 두 개의 테이블을 하나로 만드는 연산.
두 개 테이블의 컬럼 수, 컬럼 데이터 형식이 모두 일치해야 함.
UNION 연산은 두 개의 테이블을 하나로 합치면서 중복된 데이터를 제거한다. 정렬을 발생
- UNION ALL은 중복을 제거하거나 정렬을 유발하지 않는다. 중복제거 없이 전부 보여줌
두 개 테이블의 컬럼 수가 같아야 하는 것은 동일
- Reference
https://prinha.tistory.com/entry/MySQL-COALESCE-%ED%95%A8%EC%88%98
https://whitepro.tistory.com/580
https://gooreumwave.tistory.com/25
문제:
ONLINE_SALE 테이블과 OFFLINE_SALE 테이블에서
2022년 3월의 오프라인/온라인 상품 판매 데이터의 판매 날짜, 상품ID, 유저ID, 판매량을 출력
OFFLINE_SALE 테이블의 판매 데이터의 USER_ID 값은 NULL 로 표시
판매일을 기준으로 오름차순 정렬,
판매일이 같다면 상품 ID를 기준으로 오름차순,
상품ID까지 같다면 유저 ID를 기준으로 오름차순 정렬
문제 파악:
두개 테이블을 합쳐서, 날짜에 맞는 조건들만 건져내면 된다.
날짜만 포맷을 바꿔서 바꿔주면 되었음.
아래와 같이 NULL 값 표기가 필요할 때는,
문자열 "NULL" 나타내는 것이 아닌 NULL 로만 기재하는 것만 유의하면 쉽게 풀 수 있는 문제
* 아래처럼 With 구문을 쓰지 않고 테이블 2개를 한번에 묶고, 정렬해줘도 풀 수 있을 것 같다.
(SELECT *
FROM TABLE_1
UNION
SELECT *
FROM TABLE_2)
ORDER BY ~~~
풀이:
WITH COUNTER AS (
SELECT DATE_FORMAT(SALES_DATE, "%Y-%m-%d") AS SALES_DATE
, PRODUCT_ID
, USER_ID
, SALES_AMOUNT
FROM ONLINE_SALE AS ONSALE
UNION ALL
SELECT DATE_FORMAT(SALES_DATE, "%Y-%m-%d") AS SALES_DATE
, PRODUCT_ID
, NULL AS USER_ID
, SALES_AMOUNT
FROM OFFLINE_SALE AS OFFSALE
)
SELECT *
FROM COUNTER
WHERE SALES_DATE LIKE '2022-03%'
ORDER BY SALES_DATE,PRODUCT_ID,USER_ID
'sql > easy' 카테고리의 다른 글
프로그래머스 Lv 4 - 년, 월, 성별 별 상품 구매 회원 수 구하기 (0) | 2023.07.14 |
---|---|
프로그래머스 Lv 4 - 주문량이 많은 아이스크림들 조회하기 (0) | 2023.07.10 |
프로그래머스 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 |