문제
TROUBLE POINT
두 집합을 JOIN이 하면 중복된 데이터를 결합하게 되어 모든 데이터를 통합하는 것이 아니다.
이때 이용 할 것이 UNION 인데.. 두 테이블의 COLUMN의 개수가 다르다. 이때 존재하지 않는 컬럼을 하나 생성하여 서로 합집합 처리를 해야한다.
배워야 할 것
1. NULL AS COLUMN명
NULL값만을 가진 COLUMN을 생성때 쓴다.
지금 문제의 경우 COLUMN의 개수가 차이가 나고 빈값으로 취급하고싶으니 OFFLINE_SALE에 USER_ID를 NULL 처리
NULL AS USER_ID
이렇게 입력해주면 SELECT를 할때 이름은 USER_ID이고 NULL 인 테이블이 조회되게 할수 있다.
SELECT TO_CHAR(SALES_DATE,'YYYY-MM-DD'), PRODUCT_ID ,NULL AS USER_ID , SALES_AMOUNT
FROM OFFLINE_SALE
WHERE TO_CHAR(SALES_DATE,'MM') = '03'
이렇게 ONLINE_SALE 테이블과 OFFLINE_TABLE의 개수가 일치하게 되었다.
2. ORDER BY COLUMN_NUMBER
UNION ALL을 통해 합집합 해준 후에 정렬을 편하게 하려고 하는데
SELECT와 FROM절 내에 다시 UNION ALL을 넣어줄 경우에 코드가 상당히 더럽고 불편해진다.
이때 UNION 만으로도 우리가 원하는 정보가 다 출력 되었으므로 우리는 이 것을 정렬만 하고 싶다.
이때 우리는 우리가 원하는 순서대로 SELECT 해준 후
ORDER BY 이를 이름이 아닌 숫자
예시
ORDER BY 1 ASC, 2 DESC, 4, 3
과 같은 방식으로 SELECT에 있는 COLUMN의 순서대로 ROW를 오름,내림차순 정렬 할 수 있다.
해답
(
SELECT TO_CHAR(SALES_DATE,'YYYY-MM-DD'), PRODUCT_ID , USER_ID, SALES_AMOUNT
FROM ONLINE_SALE
WHERE TO_CHAR(SALES_DATE,'MM') = '03'
)
UNION ALL
(
SELECT TO_CHAR(SALES_DATE,'YYYY-MM-DD'), PRODUCT_ID ,NULL AS USER_ID , SALES_AMOUNT
FROM OFFLINE_SALE
WHERE TO_CHAR(SALES_DATE,'MM') = '03'
)
ORDER BY 1,2,3
NULL 처리를 하는과정에서 NULL이 아닌 0을 쓰고 다시 NULL로 처리하려니 처리가 안되어 상당히 곤란했다.
다른사람의 풀이를 보고 풀었 던 만큼 다시 풀었을 때 지장이 없도록 하자.