WITH RECURSIVE TIME AS(
SELECT 0 as hour
UNION ALL
SELECT hour + 1 FROM time
WHERE HOUR < 23)
SELECT time.hour, COUNT(animal_id)
FROM (SELECT *, HOUR(datetime) AS hour
FROM animal_outs) AS outs2
RIGHT JOIN time
ON outs2.hour = time.hour
GROUP BY time.hour
ORDER BY time.hour
SELECT date_format(tbl.SALES_DATE,'%Y-%m-%d') sales_date, tbl.product_id, ifnull(user_id,null) user_id, sum(tbl.sales_amount) sales_amount
FROM (select * from ONLINE_SALE
where date_format(SALES_DATE,'%Y-%m')='2022-03'
union
select * ,null as user_id from OFFLINE_SALE
WHERE date_format(SALES_DATE,'%Y-%m')='2022-03') tbl
group by tbl.sales_date, tbl.product_id, tbl.user_id
order by tbl.sales_date, tbl.product_id, tbl.user_id
-- https://school.programmers.co.kr/learn/courses/30/lessons/131537
SELECT date_format(tbl.SALES_DATE,'%Y-%m-%d') sales_date, tbl.product_id, ifnull(user_id,null), sum(tbl.sales_amount) sales_amount
FROM (select * from ONLINE_SALE
where date_format(SALES_DATE,'%Y-%m')='2022-03'
union
select OFFLINE_SALE_ID, null as user_id, PRODUCT_ID, SALES_AMOUNT, SALES_DATE from OFFLINE_SALE
WHERE date_format(SALES_DATE,'%Y-%m')='2022-03') tbl
group by tbl.sales_date, tbl.product_id, tbl.user_id
order by tbl.sales_date, tbl.product_id, tbl.user_id
union할 때 칼럼의 순서를 동일하게 해줘야한다
동일하게 해주지 않아도 이번 문제에서는 결과가 동일하긴 하지만 순서를 맞춰야 정답처리가 된다. 원래 순서를 맞춰서 해주는 게 맞는 것 같다
grouping을 할 때 날짜로만 하면 날짜별로 한 건씩만 출력되어 user_id, product_id가 대표되는 하나만 출력되기때문에 문제의 의도와는 다른 답이 출력된다
grouping을 아예 안하고 sum(sales_amount)를 안해도 정답처리가 된다
오프라인과 온라인 테이블이 나눠져있고 그 두 개를 합집합한 것만으로도 필요한 처리가 다 끝났던 것 같다.
ifnull(칼럼명, null)은 안해줘도 된다 어차피 널값이면 널로 나오는데 뭘
서브쿼리를 써서 테이블을 만들면 alias를 꼭 만들어서 써줘야한다
SELECT date_format(tbl.SALES_DATE,'%Y-%m-%d') sales_date, tbl.product_id, user_id, tbl.sales_amount
FROM (select * from ONLINE_SALE
where date_format(SALES_DATE,'%Y-%m')='2022-03'
union
select OFFLINE_SALE_ID, null as user_id, PRODUCT_ID, SALES_AMOUNT, SALES_DATE from OFFLINE_SALE
WHERE date_format(SALES_DATE,'%Y-%m')='2022-03') tbl
order by tbl.sales_date, tbl.product_id, tbl.user_id
mysql에서 full outer join 하는 방법
-> mysql에는 full outer join이 없어서 left outer join, right outer join을 각각 실행한 후 union을 해야함
https://gywlsp.github.io/mysql/5/