[MySQL] 프로그래머스 문제 연습 13

Lake·2024년 5월 6일
0

SQL 문제

목록 보기
16/36
post-thumbnail

서울에 위치한 식당 목록 출력하기 (SELECT)

  • REST_INFOREST_REVIEW 테이블에서 서울에 위치한 식당들의 식당 ID, 식당 이름, 음식 종류, 즐겨찾기수, 주소, 리뷰 평균 점수를 조회하는 SQL문을 작성해주세요. 이때 리뷰 평균점수는 소수점 세 번째 자리에서 반올림 해주시고 결과는 평균점수를 기준으로 내림차순 정렬해주시고, 평균점수가 같다면 즐겨찾기수를 기준으로 내림차순 정렬해주세요.

제출한 쿼리 :

SELECT I.REST_ID
     , I.REST_NAME
     , I.FOOD_TYPE
     , I.FAVORITES
     , I.ADDRESS
     , ROUND(AVG(R.REVIEW_SCORE), 2) AS "SCORE"
FROM REST_INFO AS I
INNER JOIN REST_REVIEW AS R ON I.REST_ID = R.REST_ID
WHERE ADDRESS LIKE "서울%"
GROUP BY I.REST_ID, I.FOOD_TYPE, I.FAVORITES, I.ADDRESS
ORDER BY SCORE DESC, I.FAVORITES DESC;

식당 주소가 '서울특별시'가 아닌 '서울시'로 되어있는 데이터값이 있으므로 '서울특별시%'가 아니라 '서울%'로 조건을 지정해 주었다.


자동차 대여 기록에서 장기/단기 대여 구분하기 (STRING, DATE)

  • CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 대여 시작일이 2022년 9월에 속하는 대여 기록에 대해서 대여 기간이 30일 이상이면 '장기 대여' 그렇지 않으면 '단기 대여' 로 표시하는 컬럼(컬럼명: RENT_TYPE)을 추가하여 대여기록을 출력하는 SQL문을 작성해주세요. 결과는 대여 기록 ID를 기준으로 내림차순 정렬해주세요.

제출한 쿼리 :

SELECT HISTORY_ID
       , CAR_ID
       , DATE_FORMAT(START_DATE, '%Y-%m-%d') AS START_DATE
       , DATE_FORMAT(END_DATE, '%Y-%m-%d') AS END_DATE
       , CASE WHEN DATEDIFF(END_DATE, START_DATE)+1 >= 30 THEN '장기 대여'
              ELSE '단기 대여' 
         END AS "RENT_TYPE" 
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE DATE_FORMAT(START_DATE, '%Y-%m') LIKE '2022-09'
ORDER BY HISTORY_ID DESC;

DATEDIFF는 날짜의 차이를 구해주기 때문에 여기서는 datediff(enddate, startdate)가 아니라 datediff(enddate, startdate) + 1로 계산을 해줘야 한다.(9월 1일에 대여해서 9월 1일에 반납하면 대여기간이 1일, 9월 2일 대여해서 9월 2일에 반납 해야 대여기간이 2일이 되기 때문)


자동차 평균 대여기간 구하기 (STRING, DATE)

  • CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 평균 대여 기간이 7일 이상인 자동차들의 자동차 ID와 평균 대여 기간(컬럼명: AVERAGE_DURATION) 리스트를 출력하는 SQL문을 작성해주세요. 평균 대여 기간은 소수점 두번째 자리에서 반올림하고, 결과는 평균 대여 기간을 기준으로 내림차순 정렬해주시고, 평균 대여 기간이 같으면 자동차 ID를 기준으로 내림차순 정렬해주세요.

제출한 쿼리 :

SELECT CAR_ID
       , ROUND(AVG(DATEDIFF(END_DATE, START_DATE) + 1), 1) AS "AVERAGE_DURATION"
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
HAVING AVERAGE_DURATION >= 7
ORDER BY AVERAGE_DURATION DESC, CAR_ID DESC;

헤비 유저가 소유한 장소

  • 이 서비스에서는 공간을 둘 이상 등록한 사람을 "헤비 유저"라고 부릅니다. 헤비 유저가 등록한 공간의 정보를 아이디 순으로 조회하는 SQL문을 작성해주세요.

제출한 쿼리 :

WITH HeavyUsers AS (
    SELECT HOST_ID
    FROM PLACES
    GROUP BY HOST_ID
    HAVING COUNT(*) >= 2
)
SELECT *
FROM PLACES
WHERE HOST_ID IN (SELECT HOST_ID FROM HeavyUsers)
ORDER BY ID;

헤비 유저는 하나 이상의 공간을 등록한 사용자를 의미하므로, 단순히 HOST_ID가 2 이상인 사용자를 선택하는 것으로는 헤비 유저를 정확하게 식별할 수 없다.
그렇기 때문에 다음과 같은 쿼리를 사용할 수 없다.

SELECT ID
       , NAME
       , HOST_ID
FROM PLACES
WHERE HOST_ID >= 2
ORDER BY ID; 

예를 들어 HOST_ID가 2, 3, 4인 사용자 중에서 2번 사용자만 헤비 유저라면, 위의 쿼리는 2, 3, 4번 사용자의 공간을 모두 선택하게 되기 때문이다.


우유와 요거트가 담긴 장바구니

  • 데이터 분석 팀에서는 우유(Milk)와 요거트(Yogurt)를 동시에 구입한 장바구니가 있는지 알아보려 합니다. 우유와 요거트를 동시에 구입한 장바구니의 아이디를 조회하는 SQL 문을 작성해주세요. 이때 결과는 장바구니의 아이디 순으로 나와야 합니다.

제출한 쿼리 :

SELECT CART_ID
FROM CART_PRODUCTS
WHERE NAME IN ('Milk', 'Yogurt')
GROUP BY CART_ID
HAVING COUNT(DISTINCT NAME) = 2
ORDER BY CART_ID;

"우유"와 "요거트" 두 제품이 동시에 포함되어야 하므로, DISTINCT를 사용하여 중복된 제품을 하나로 취급해준다.


오늘의 TMI

살얼음판을 걷는 기분

0개의 댓글