SQL/MY SQL 문제 풀이(프로그래머스)

[MYSQL] PROGRAMMERS_오프라인/온라인 판매 데이터 통합하기

몽총한몽이네 2024. 2. 24. 03:13
반응형

SELECT DATE_FORMAT(SALES_DATE,"%Y-%m-%d")SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT
FROM ONLINE_SALE
WHERE 1=1
AND SALES_DATE like "2022-03%"

UNION ALL 

SELECT DATE_FORMAT(SALES_DATE,"%Y-%m-%d")SALES_DATE, PRODUCT_ID , "NULL", SALES_AMOUNT
FROM OFFLINE_SALE
WHERE 1=1
AND SALES_DATE like "2022-03%"
ORDER BY 1,2,3

문제

ONLINE_SALE 테이블과 OFFLINE_SALE 테이블에서 2022년 3월의 오프라인/온라인 상품 판매 데이터의 판매 날짜, 상품ID, 유저ID, 판매량을 출력하는 SQL문을 작성. OFFLINE_SALE 테이블의 판매 데이터의 USER_ID 값은 NULL 로 표시해주세요. 결과는 판매일을 기준으로 오름차순 정렬 판매일이 같다면 상품 ID를 기준으로 오름차순, 상품ID까지 같다면 유저 ID를 기준으로 오름차순 정렬

 

두개의 값을 가진 데이터를 합치는 쿼리이다. 참고로 My SQL 에서는 FULL OUTER JOIN이 지원되지 않아 LEFT OUTER + RIGHT INNER를 합쳐서 한다던지 해야한다.. 그러긴 귀찮으므로 UNION ALL을 해버리는게 낫다. UNION의 경우에는 각각의 테이블에 중복값이 있을 경우 distinct 해버릴 수 있고 만약 그럴 필요가 없을 경우에는 UNION ALL이 성능이 더좋기 때문에 UNION ALL을 사용하자.

 

일단 UNION ALL을 사용하려면 위와 아래의 쿼리의 컬럼수가 일치해야한다. 컬럼명은 위의 쿼리 기준으로 정렬 된다. 일단 SELECT 문부터 정리하면 맨앞에 날짜 포맷부터 맞추어준다. 뒤에 시 분 초 부분을 제거해야해서 포맷을 맞추고 alias 명도 맞추어 준다. 그후 WHERE 조건문에 2022년 3월 의 필터를 추가해주었다.

 

그리고 똑같은 조건으로 OFFLINE_SALE 테이블로 같은 쿼리를 복사해서 만들어준다. 그러나 OFFLINE 테이블에는 USER_ID 컬럼이 없고 조건 사항에 USER_ID 부분을 NULL값으로 대체해서 입력 하라고 되어있다. 예시문에 NULL이 시각적으로 표기 되어있으니까.. 문자인 NULL로  표기 해야할듯 하다. 그냥 NULL을 입력하면 공백이 나오기 때문이다. 따라서 컬럼 자체를 "NULL"로 해준다. (만약 NULL을 요청하면 "" 을 제거해서 기입해주면된다) 그러면 해당 테이블 컬럼의 모든값이 NULL로 기입된다. 

 

그리고 위 아래 쿼리를 UNION ALL로 묶어주고 맨아래에 통합 정렬을 해주면 마무리가 된다.

 

참고로.. OFFLINE 데이터는 3월데이터가 없어서 NULL 이 표기조차 되지않아.. 사실 아래 쿼리 없어도 답은 일치한다...

반응형