[프로그래머스] 오프라인/온라인 판매 데이터 통합하기 (MySQL)
목차
개요
코딩테스트 연습 - 오프라인/온라인 판매 데이터 통합하기 | 프로그래머스 스쿨 (programmers.co.kr)
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제가 길다. 확인해보니까 레벨 4짜리 문제!
풀이
두 테이블이 있는데 이 두 테이블로부터 전부 정보를 뽑아와야 한다. 대충 생각해봤을 때는 결국 어떻게든 두 테이블을 행을 늘리는 방식으로 합치는 것. JOIN을 하면 열이 늘어나는데, 다른 방법이 필요한 것이다.
일단 각각 SELECT를 하면 되지 않을까 싶었다.
그런데 그렇게 생각하니 이전에 UNION ALL을 썼던 것이 문득 생각이 났다.
UNION ALL
그런데 UNION ALL을 쓰려면 일단 두 테이블의 컬럼이 일치해야 한다...
근데 오류 구문을 잘 보니까 SELECT 문이 다른 갯수의 컬럼을 가지고 있는 것이 문제라고 하고 있다.
그러면 생각보다 문제는 쉬워진다. 이딴 게.. 레벨 4..?
라고 하기에는 UNION ALL을 어떻게 쓰는지 기억이 안 나 내 이전 글을 다시 봤다. 실제 시험에서는 그런 검색이 불가하니기고만장하지 말고 익히는데 집중하자.
간단하게 요구사항을 충족할 수 있다. NULL 값을 어떻게 넣을 것인가는 그냥 검색해봤다.
이때 생각해볼 지점은 어떻게 정렬할 것인가?
서브 쿼리
그러면 서브 쿼리로 만든 다음에 한꺼번에 정렬하면 되지 않을까? 일단 UNION ALL에 대해서 어떤 작동을 바로 하는 방법은 모르겠으니..
뭔가 또 귀찮은 에러가 뜨는구만.. 테이블은 각자의 별칭을 가져야 한다?
MySQL Every derived table must have its own alias 에러 해결방법 (tistory.com)
뭔 소리인가 했는데, MySQL에서는 서브 쿼리에 대해서 꼭 별칭을 부여해야 한다고 한다.
코드
SELECT *
FROM
(
SELECT
DATE_FORMAT(SALES_DATE, '%Y-%m-%d') 'SALES_DATE',
PRODUCT_ID, USER_ID, SALES_AMOUNT
FROM ONLINE_SALE
WHERE MONTH(SALES_DATE) = 3
UNION ALL
SELECT
DATE_FORMAT(SALES_DATE, '%Y-%m-%d') 'SALES_DATE',
PRODUCT_ID, NULL 'USER_ID', SALES_AMOUNT
FROM OFFLINE_SALE
WHERE MONTH(SALES_DATE) = 3
) A
ORDER BY SALES_DATE, PRODUCT_ID, USER_ID
;
다른 사람들의 정답 코드를 찾아보니 서브 쿼리로 만들지 않더라도, 그냥 두 SELECT문을 괄호로 묶어주고 거기에 ORDER BY를 해도 되는 모양이다.
(
SELECT
DATE_FORMAT(SALES_DATE, "%Y-%m-%d") '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") '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
;
요로코롬!
이렇게 보니까 줄바꿈해서 ; 붙이는 게 굉장히 더러워 보인다;;
;