SQL

[0114 TIL] sql 코드카타 lv5 ( where 서브쿼리, date_format, union / union all, 월(숫자)구하기 month(), count())

sjy0074 2025. 1. 14. 13:40

그룹별 조건에 맞는 식당 목록 출력하기

문제

MEMBER_PROFILE와 REST_REVIEW 테이블에서 리뷰를 가장 많이 작성한 회원의 리뷰들을 조회하는 SQL문을 작성해주세요. 회원 이름, 리뷰 텍스트, 리뷰 작성일이 출력되도록 작성해주시고, 결과는 리뷰 작성일을 기준으로 오름차순, 리뷰 작성일이 같다면 리뷰 텍스트를 기준으로 오름차순 정렬해주세요.

 

 

정답코드

-- 코드를 입력하세요
SELECT m.member_name, r.review_text, date_format(r.review_date,'%Y-%m-%d')as review_date
from member_profile m join rest_review r on m.member_id = r.member_id
where m.member_id = (
                     select member_id
                     from rest_review
                     group by member_id
                     order by count(review_id)desc
                     limit 1
                     )
order by review_date, r.review_text

 

 

 

내가 시도하려고 한 것

-- 코드를 입력하세요
SELECT m.member_name, r.review_text, r.review_date
from member_profile m inner join rest_review r on m.member_id = r.member_id
where m.member_id in (
    select member_id
    from rest_review
    group by member_id
    having count(review_id)
    order by count(review_id)desc
    limit 1
    )
order by r.review_date asc, r.review_text asc

-줄맞춤이 앞쪽에 맞춰있으니 limit 이 서브쿼리에서 사용불가라뜸

- where 절에 in 아니고 = 하면 됨

-date_format 안했었음

-멤버아이디로 그룹핑, 카운트는 리뷰아이디를 해야함

 


 

 

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

문제

ONLINE_SALE 테이블과 OFFLINE_SALE 테이블에서 2022년 3월의 오프라인/온라인 상품 판매 데이터의 판매 날짜, 상품ID, 유저ID, 판매량을 출력하는 SQL문을 작성해주세요. OFFLINE_SALE 테이블의 판매 데이터의 USER_ID 값은 NULL 로 표시해주세요. 결과는 판매일을 기준으로 오름차순 정렬해주시고 판매일이 같다면 상품 ID를 기준으로 오름차순, 상품ID까지 같다면 유저 ID를 기준으로 오름차순 정렬해주세요.

 

-- 코드를 입력하세요
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

 

내가 시도하려고 한 것

- join 다음 날짜로 거르고, 빈 값 있는곳에 null 처리...?를 어떻게 하지 까지 생각함

 

새롭게 배운 것

** union / union all

 

union

: 여러 select 문의 결과를 수직으로 결합, 중복된 행은 제거->중복된 데이터가 제거되므로 성능이 다소 떨어질 수 있음

단, select 문의 열 수와 데이터 형식이 동일해야 함

 

-- union 예시 : 중복제거
select 고객ID
from customers
where 성별 = 'M'
union
select 고객ID
from orders;

 

union all

여러 select 문의 결과를 수직으로 결합 , 중복된 행도 포함

 

 


 

 

대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기

문제

CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 대여 시작일을 기준으로 2022년 8월부터 2022년 10월까지 총 대여 횟수가 5회 이상인 자동차들에 대해서 해당 기간 동안의 월별 자동차 ID 별 총 대여 횟수(컬럼명: RECORDS) 리스트를 출력하는 SQL문을 작성해주세요. 결과는 월을 기준으로 오름차순 정렬하고, 월이 같다면 자동차 ID를 기준으로 내림차순 정렬해주세요. 특정 월의 총 대여 횟수가 0인 경우에는 결과에서 제외해주세요.

 

-- 코드를 입력하세요
SELECT month(start_date) as month, car_id, count(history_id) as records 
from car_rental_company_rental_history
where car_id in (select car_id
                from car_rental_company_rental_history
                where start_date between '2022-08-01' and '2022-10-31'
                group by car_id
                having count(history_id) >= 5)
      and start_date between '2022-08-01' and '2022-10-31'
group by 1,2
order by month, car_id desc

 

내가 시도하려고 한 것 

- 정답과 유사하게 왔으나, where 절 서브쿼리에서는 날짜로 잘 거르고, 바깥 조건에서는 거르지 않아서 계속 오답이 나옴.