Problem Solving/프로그래머스

[MySQL] 프로그래머스 131537. 오프라인/온라인 판매 데이터 통합하기

LeeJaeJun 2024. 2. 20. 22:57
728x90
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/131537

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

정답 코드
SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT
FROM ONLINE_SALE
WHERE SALES_DATE LIKE '2022-03%'
UNION
SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE, PRODUCT_ID, NULL AS USER_ID, SALES_AMOUNT
FROM OFFLINE_SALE
WHERE SALES_DATE LIKE "2022-03%"
ORDER BY SALES_DATE, PRODUCT_ID, USER_ID

# NULL AS USER_ID -> USER_ID가 없으므로 NULL값으로 채운다
SELECT DATE_Format(SALES_DATE, '%Y-%m-%d') AS SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT 
FROM ONLINE_SALE 
WHERE Month(SALES_DATE) = 3
UNION
SELECT DATE_Format(SALES_DATE, '%Y-%m-%d') AS SALES_DATE, PRODUCT_ID, Null as USER_ID, SALES_AMOUNT
FROM OFFLINE_SALE
WHERE Month(SALES_DATE) = 3
ORDER BY SALES_DATE, PRODUCT_ID, USER_ID
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

union 연산

중복값은 하나만 추가하여 더하여 새로운 테이블을 만든다.

여러 개의 SELECT 문의 결과를 단일 결과 세트로 연결 표현할떄 사용
(합친 결과에서 중복되는 행은 하나만 표시합니다. => DISTINCT 키워드를 따로 명시하지 않아도 기본적으로 중복되는 레코드를 제거)

  • UNION 내의 각 SELECT 문은 같은 수의 열을 가져야 한다.
  • 각각 SELECT 문의 열은 또한 동일한 순서로 있어야 한다.
  • 열은 호환되는 데이터 형식을 가져야 한다.
# 3개 합치는 법
SELECT 열1, 열2, ...
FROM 테이블1
WHERE 조건

UNION

SELECT 열1, 열2, ...
FROM 테이블2
WHERE 조건

UNION

SELECT 열1, 열2, ...
FROM 테이블3
WHERE 조건;
728x90
반응형