OracleDB/OracleDB 코딩테스트 해결과정

프로그래머스 스쿨(Oracle - Lv.4) - 오프라인/온라인 판매 데이터 통합하기 ( UNION ALL 합집합 사용하기 / NULL값 컬럼 만들기)
깝몬 2023. 6. 20. 15:15

문제

 

 

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로 처리하려니 처리가 안되어 상당히 곤란했다.

 

다른사람의 풀이를 보고 풀었 던 만큼 다시 풀었을 때 지장이 없도록 하자.