[프로그래머스] SQL 고득점 Kit - select (Level 4)

박채은·2023년 6월 23일
0

코딩테스트

목록 보기
47/52

1. 서울에 위치한 식당 목록 출력하기

SELECT r.REST_ID, i.REST_NAME, i.FOOD_TYPE, i.FAVORITES, i.ADDRESS, ROUND(avg(REVIEW_SCORE),2) as SCORE
from REST_REVIEW r
left outer join REST_INFO i
on r.REST_ID = i.REST_ID
where ADDRESS like '서울%'
group by REST_ID
order by SCORE desc, FAVORITES desc
  • 서울에 위치하며, 각 식당의 정보와, 해당 식당의 리뷰 평균 점수를 출력하는 문제이다.
  • 리뷰 평균점수는 소수점 세 번째 자리에서 반올림
  • 결과는 평균점수를 기준으로 내림차순 정렬, 평균점수가 같다면 즐겨찾기수를 기준으로 내림차순 정렬
  • 처음에 풀 때는 group by를 안 했었는데, 그렇게 된다면 ROUND(avg(REVIEW_SCORE),2)를 했을 때 문제가 발생한다.
  • group으로 묶인 게 없으니 모든 행의 avg()를 처리해버릴 것이고, 그렇게 되면 하나의 행 밖에 출력되지 않는다.
    따라서 집계 함수를 사용할 때는 GROUP BY는 거의 세트라고 생각하고 풀자!

참고 블로그


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

Union

SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;
  • Union은 두 개의 테이블을 하나로 만드는 연산이기 때문에 두 개 테이블의 칼럼 수, 칼럼 데이터 형식이 순서대로 일치해야 한다.
  • 만약 두 테이블의 칼럼이 다른 경우 어떻게 Union을 사용할 수 있는가?
    • 칼럼의 자리에 값을 부여해준다. -> NULL AS 새로운 칼럼명
  • Union과 Union All의 차이점은 무엇인가?
    • Union은 두 테이블을 합치면서 중복된 데이터를 제거하고 정렬을 한다.
    • Union All은 중복을 제거하거나 정렬을 유발하지 않는다.

https://www.w3schools.com/sql/sql_union.asp
https://jmkim.tistory.com/50

최종 코드

(SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') as SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT
from ONLINE_SALE
where YEAR(SALES_DATE) = 2022 and MONTH(SALES_DATE) = 03
Union
SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') as SALES_DATE, PRODUCT_ID, NULL as USER_ID, SALES_AMOUNT
from OFFLINE_SALE
where YEAR(SALES_DATE) = 2022 and MONTH(SALES_DATE) = 03)
order by SALES_DATE, PRODUCT_ID, USER_ID;

0개의 댓글