0615 til

looggi·2023년 6월 14일
0

TILs

목록 보기
93/114
post-thumbnail

입양 시각 구하기(2) 0614

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


오프라인/온라인 판매 데이터 통합하기 0615

틀린 답🥷

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

😼 full outer join

mysql에서 full outer join 하는 방법
-> mysql에는 full outer join이 없어서 left outer join, right outer join을 각각 실행한 후 union을 해야함
https://gywlsp.github.io/mysql/5/

profile
looooggi

0개의 댓글