https://school.programmers.co.kr/learn/courses/30/lessons/131537
프로그래머스
코드 중심 개발자 채용. 스택 기반 포지션 매칭 프로그래머스 개발자를 위한 커스텀 프로파일을 등록하고 나와 기술의 궁합이 잘 맞는 기업을 매칭합니다.
programmers.co.kr
문제 설명
다음은 어떤 의류 쇼핑몰의 온라인 상품 판매 정보가 포함되어 있습니다. ONLINE_SALE 테이블 및 오프라인 상품 판매 정보 포함 OFFLINE_SALE 테이블입니다. ONLINE_SALE 테이블은 다음과 같은 구조로 되어 있습니다. ONLINE_SALE_ID, USER_ID, PRODUCT_ID, SALES_AMOUNT, SALES_DATE는 각각 온라인 상품 판매 ID, 회원 ID, 상품 ID, 판매량 및 판매일을 나타냅니다.
Column nameTypeNullable
ONLINE_SALE_ID | INTEGER | 거짓 |
USER_ID | INTEGER | 거짓 |
PRODUCT_ID | INTEGER | 거짓 |
SALES_AMOUNT | INTEGER | 거짓 |
SALES_DATE | DATE | 거짓 |
동일한 날짜, 회원 ID 및 상품 ID 조합에 대해 하나의 판매 데이터만 존재합니다.
OFFLINE_SALE 테이블은 다음과 같은 구조로 되어 있습니다. OFFLINE_SALE_ID, PRODUCT_ID, SALES_AMOUNT, SALES_DATE는 각각 오프라인 상품 판매 ID, 상품 ID, 판매량 및 판매일을 나타냅니다.
Column nameTypeNullable
OFFLINE_SALE_ID | INTEGER | 거짓 |
PRODUCT_ID | INTEGER | 거짓 |
SALES_AMOUNT | INTEGER | 거짓 |
SALES_DATE | DATE | 거짓 |
동일한 날짜, 상품 ID 조합에 대해 하나의 판매 데이터만 존재합니다.
문제
ONLINE_SALE 테이블과 OFFLINE_SALE 테이블에서 2022년 3월 오프라인/온라인 상품 판매 데이터의 판매일, 상품 ID, 사용자 ID, 판매량을 출력하는 SQL문을 작성하십시오. OFFLINE_SALE 테이블 판매 데이터 USER_ID 값은 NULL로 표시하십시오. 결과는 판매일을 기준으로 오름차순으로 정렬하십시오.
예
예를 들면 ONLINE_SALE 테이블은 다음과 같습니다.
ONLINE_SALE_IDUSER_IDPRODUCT_IDSALES_AMOUNTSALES_DATE
1 | 1 | 3 | 2 | 2022-02-25 |
2 | 4 | 4 | 1 | 2022-03-01 |
4 | 2 | 2 | 2 | 2022-03-02 |
3 | 6 | 3 | 3 | 2022-03-02 |
5 | 5 | 5 | 1 | 2022-03-03 |
6 | 5 | 7 | 1 | 2022-04-06 |
OFFLINE_SALE 테이블이 다음과 같은 경우
OFFLINE_SALE_IDPRODUCT_IDSALES_AMOUNTSALES_DATE
1 | 1 | 2 | 2022-02-21 |
4 | 1 | 2 | 2022-03-01 |
3 | 3 | 3 | 2022-03-01 |
2 | 4 | 1 | 2022-03-01 |
5 | 2 | 1 | 2022-03-03 |
6 | 2 | 1 | 2022-04-01 |
각 테이블의 2022년 3월 판매 데이터를 정렬하여 정렬한 결과는 다음과 같습니다.
SALES_DATEPRODUCT_IDUSER_IDSALES_AMOUNT
2022-03-01 | 1 | NULL | 2 |
2022-03-01 | 3 | NULL | 3 |
2022-03-01 | 4 | NULL | 1 |
2022-03-01 | 4 | 4 | 1 |
2022-03-02 | 2 | 2 | 2 |
2022-03-02 | 3 | 6 | 3 |
2022-03-03 | 2 | NULL | 1 |
2022-03-03 | 5 | 5 | 1 |
내 잔디
SELECT DATE_FORMAT(SALES_DATE,"%Y-%m-%d") SALES_DATE,
PRODUCT_ID,
USER_ID,
SALES_AMOUNT
FROM ONLINE_SALE
WHERE sales_date >= '2022-03-01' and sales_date < '2022-04-01'
UNION ALL
SELECT DATE_FORMAT(SALES_DATE,"%Y-%m-%d") SALES_DATE,
PRODUCT_ID,
NULL AS USER_ID,
SALES_AMOUNT
FROM OFFLINE_SALE
WHERE sales_date >= '2022-03-01' and sales_date < '2022-04-01'
ORDER BY SALES_DATE , PRODUCT_ID , USER_ID
처음에는 JOIN을 사용하여 테이블을 맞추면 좋다고 생각했습니다.
UNION을 사용하여 해결하는 문제였습니다.
https://monawa.tistory.com/103
(MY SQL) JOIN과 UNION
JOIN JOIN은 두 테이블을 함께 데이터를 수집하는 방법입니다.링크하려면 테이블이 하나 이상의 열을 공유해야 합니다. INNER JOIN(내부 조인) 두 테이블을 조인할 때
monawa.tistory.com
주의해야 할 점은 OFFLINE_SALE 테이블의 USER_ID를 NULL로 취급해야합니다!