
1. 문제 설명


2. 접근 방법
문제를 보고 든 생각은 `연관 컬럼이 없을 때는 테이블을 어떻게 조인하는가?` -> 그래서 카테시안 곱이 떠올랐다.
모든 조합을 생성하는 경우를 카테시안 곱(Cartesian Product)이라고 하는데 CROSS JOIN 해 주는 것이다.
일단 여기까지만 작성 하고 쿼리를 실행시켜 보기로 했다. 테이블이 옆으로 붙었다.

여기서 날짜별로 GROUP BY 해 보고 뭔가 해 보려고 했는데 중간에 기가 막힌 생각이 났다.
테이블을 옆이 아니라 아래로 붙이면 되겠다.
그럼 UNION ALL을 써 보는게 어떨까?
그래서 아래로 데이터를 붙이는게 좋겠다고 생각했다.
그리고 중복값을 없애면 안되기 때문에 UNION이 아니라 UNION ALL... 설마...!!
SELECT SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT
FROM ONLINE_SALE
UNION ALL
SELECT SALES_DATE, PRODUCT, ?, SALES_AMOUNT
FROM OFFLINE_SALE
여기까지 썼는데 문제는 ONLINE_SALE 테이블에는 USER_ID가 있는데 OFFLINE_SALE 테이블에는 없다는 것이다. 이렇게 매칭 안 되는 컬럼은 어떻게 해 줘야 하는지 궁금해졌다. NULL AS USER_ID로 널값 넣어주고 컬럼 맞춰주니까 쿼리가 문제없이 실행된다. 새로운 사실 발견!
SELECT SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT
FROM ONLINE_SALE
UNION ALL
SELECT SALES_DATE, PRODUCT_ID, NULL AS USER_ID, SALES_AMOUNT
FROM OFFLINE_SALE
이제 여기서 SALES_DATE만 포매팅 해주고, SALES_DATE로 GROUP BY 해 주면 되는건가!

실행은 되는데 틀렸다고 한다....?
아! 문제를 읽어보니까 `2022-03월 데이터`만 가지구 와야 한다.
그리구 날짜별로 그룹 바이 안 해도 된다!!
출력테이블에 동일한 날짜 컬럼이 여러 개 있기 때문이다.
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 ALL
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 PRODUCT_ID, USER_ID;
코드 실행은 되는데 도대체 뭐가 틀렸지?
알고 보니 ORDER BY 절에 SALES_DATE로 정렬해 주는 거 빼먹어서 그런거였음... ㅋㅋㅋㅋ
3. 정답 코드
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 ALL
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;
`수정 사항1_`
WHERE SALES_DATE LIKE '2022-03%' 를
WHERE DATE_FORMAT(SALES_DATE, '%Y-%m') = '2022-03' 로 변경
날짜는 LIKE보다는 = 로 많이 비교하는 것 같다.
`수정 사항2_`
ORDER BY 절에 SALES_DATE로 오름차순 추가 해 줌!
4단계 문제라 어려울 줄 알았는데 생각보다 엄청 쉽다><
'Algorithm > SQL테스트' 카테고리의 다른 글
[프로그래머스] (MySQL) ⭐⭐⭐ 멸종위기의 대장균 찾기 💯 (54) | 2024.11.21 |
---|---|
[프로그래머스] (MySQL) ⭐⭐⭐ 특정 세대의 대장균 찾기 문제 풀이 💯 (61) | 2024.11.21 |
[프로그래머스] 👩🏻💻 (MySQL) 대장균의 크기에 따라 분류하기 1, 2 문제 풀이 (45) | 2024.11.20 |
[프로그래머스] 👩🏻💻 (MySQL) 대장균들의 자식의 수 구하기 문제 풀이 (44) | 2024.11.20 |
[프로그래머스] 👩🏻💻 (MySQL) IS NULL 관련 문제 풀이, ⭐ 업그레이드 할 수 없는 아이템 구하기 외 (47) | 2024.11.20 |

1. 문제 설명


2. 접근 방법
문제를 보고 든 생각은 연관 컬럼이 없을 때는 테이블을 어떻게 조인하는가?
-> 그래서 카테시안 곱이 떠올랐다.
모든 조합을 생성하는 경우를 카테시안 곱(Cartesian Product)이라고 하는데 CROSS JOIN 해 주는 것이다.
일단 여기까지만 작성 하고 쿼리를 실행시켜 보기로 했다. 테이블이 옆으로 붙었다.

여기서 날짜별로 GROUP BY 해 보고 뭔가 해 보려고 했는데 중간에 기가 막힌 생각이 났다.
테이블을 옆이 아니라 아래로 붙이면 되겠다.
그럼 UNION ALL을 써 보는게 어떨까?
그래서 아래로 데이터를 붙이는게 좋겠다고 생각했다.
그리고 중복값을 없애면 안되기 때문에 UNION이 아니라 UNION ALL... 설마...!!
SELECT SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT FROM ONLINE_SALE UNION ALL SELECT SALES_DATE, PRODUCT, ?, SALES_AMOUNT FROM OFFLINE_SALE
여기까지 썼는데 문제는 ONLINE_SALE 테이블에는 USER_ID가 있는데 OFFLINE_SALE 테이블에는 없다는 것이다. 이렇게 매칭 안 되는 컬럼은 어떻게 해 줘야 하는지 궁금해졌다. NULL AS USER_ID로 널값 넣어주고 컬럼 맞춰주니까 쿼리가 문제없이 실행된다. 새로운 사실 발견!
SELECT SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT FROM ONLINE_SALE UNION ALL SELECT SALES_DATE, PRODUCT_ID, NULL AS USER_ID, SALES_AMOUNT FROM OFFLINE_SALE
이제 여기서 SALES_DATE만 포매팅 해주고, SALES_DATE로 GROUP BY 해 주면 되는건가!

실행은 되는데 틀렸다고 한다....?
아! 문제를 읽어보니까 2022-03월 데이터
만 가지구 와야 한다.
그리구 날짜별로 그룹 바이 안 해도 된다!!
출력테이블에 동일한 날짜 컬럼이 여러 개 있기 때문이다.
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 ALL 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 PRODUCT_ID, USER_ID;
코드 실행은 되는데 도대체 뭐가 틀렸지?
알고 보니 ORDER BY 절에 SALES_DATE로 정렬해 주는 거 빼먹어서 그런거였음... ㅋㅋㅋㅋ
3. 정답 코드
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 ALL 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;
수정 사항1_
WHERE SALES_DATE LIKE '2022-03%' 를
WHERE DATE_FORMAT(SALES_DATE, '%Y-%m') = '2022-03' 로 변경
날짜는 LIKE보다는 = 로 많이 비교하는 것 같다.
수정 사항2_
ORDER BY 절에 SALES_DATE로 오름차순 추가 해 줌!
4단계 문제라 어려울 줄 알았는데 생각보다 엄청 쉽다><
'Algorithm > SQL테스트' 카테고리의 다른 글
[프로그래머스] (MySQL) ⭐⭐⭐ 멸종위기의 대장균 찾기 💯 (54) | 2024.11.21 |
---|---|
[프로그래머스] (MySQL) ⭐⭐⭐ 특정 세대의 대장균 찾기 문제 풀이 💯 (61) | 2024.11.21 |
[프로그래머스] 👩🏻💻 (MySQL) 대장균의 크기에 따라 분류하기 1, 2 문제 풀이 (45) | 2024.11.20 |
[프로그래머스] 👩🏻💻 (MySQL) 대장균들의 자식의 수 구하기 문제 풀이 (44) | 2024.11.20 |
[프로그래머스] 👩🏻💻 (MySQL) IS NULL 관련 문제 풀이, ⭐ 업그레이드 할 수 없는 아이템 구하기 외 (47) | 2024.11.20 |