문제
ONLINE_SALE 테이블과 OFFLINE_SALE 테이블에서 2022년 3월의 오프라인/온라인 상품 판매 데이터의 판매 날짜, 상품ID, 유저ID, 판매량을 출력하는 SQL문을 작성해주세요. OFFLINE_SALE 테이블의 판매 데이터의 USER_ID 값은 NULL 로 표시해주세요. 결과는 판매일을 기준으로 오름차순 정렬해주시고 판매일이 같다면 상품 ID를 기준으로 오름차순, 상품ID까지 같다면 유저 ID를 기준으로 오름차순 정렬해주세요.
(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
UNION
UNION은 여러개 select 문의 결과를 하나의 테이블이나 결과 집합으로 표현할 때 사용한다. 이 때 각각의 select 문으로 선택된 필드의 개수와 타입은 모두 같아야하며, 필드의 순서 또한 같아야한다.
SELECT NAME FROM RESERVATION UNION SELECT NAME FORM CUSTOMER;
실행 결과 :
| NAME |
| 홍길동 |
| 임꺽정 |
| 장길산 |
위의 예제에서 두 select 문의 결과는 하나로 합쳐져서 출력된다. 이 때 두 select 문의 결과에서 중복된 레코드인 '홍길동'은 한 번만 표시된다.
UNION ALL
위의 예제처럼 UNION은 DISTINCT 키워드를 따로 명시하지 않아도 기본적으로 중복되는 레코드를 제거한다. 따라서 이렇게 중복되는 레코드까지 모두 출력하고 싶다면 ALL 키워드를 사용해야합니다.
다음 예제는 두 select 문의 결과를 union all 을 이용하여 하나의 테이블로 출력하는 예제다
SELECT NAME FROM RESERVATION UNION ALL SELECT NAME FROM CUSTOMER;
실행결과
| NAME |
| 홍길동 |
| 임꺽정 |
| 장길산 |
| 홍길동 |
| 홍길동 |
| 임꺽정 |
| 장길산 |
위의 예제에서 두 select 문의 결과는 하나로 합쳐져서 출력된다. 중복된 레코드까지 모두 표시된다.
이후 문제에 따라서 마지막에 order by 로 정렬하면 된다.
'SQL' 카테고리의 다른 글
| SQL 프로그래머스 131530 가격대 별 상품 개수 구하기 (0) | 2024.02.08 |
|---|---|
| SQL 개념 정리 2 JOIN(INNER JOIN, OUTER JOIN, CROSS JOIN, SELF JOIN) (0) | 2024.01.21 |
| 133026 성분으로 구분한 아이스크림 총 주문량 (0) | 2024.01.21 |
| SQL 프로그래머스 131529 카테고리 별 상품 개수 구하기 (0) | 2024.01.21 |
| SQL 프로그래머스 157342 자동차 평균 대여 기간 구하기 (0) | 2024.01.21 |