본문 바로가기

Algorithm

[SQL] 프로그래머스 고득점 KIT GROUP BY 문제 정답

즐겨찾기가 가장 많은 식당 정보 출력하기 

SELECT B.FOOD_TYPE, B.REST_ID, B.REST_NAME, B.FAVORITES
FROM (
    SELECT FOOD_TYPE, 
           MAX(FAVORITES) AS MAX_FAVORITE
    FROM REST_INFO
    GROUP BY FOOD_TYPE 
) A
INNER JOIN REST_INFO B 
ON A.FOOD_TYPE = B.FOOD_TYPE
AND A.MAX_FAVORITE = B.FAVORITES
ORDER BY FOOD_TYPE DESC;

조건에 맞는 사용자와 총 거래금액 조회하기 

SELECT 
    B.USER_ID, 
    B.NICKNAME, 
    A.PRICE_SUM
FROM (
    SELECT 
        WRITER_ID, 
        SUM(PRICE) AS PRICE_SUM
    FROM 
        USED_GOODS_BOARD 
    WHERE 
        STATUS = 'DONE'
    GROUP BY 
        WRITER_ID
) A
JOIN USED_GOODS_USER B ON A.WRITER_ID = B.USER_ID
WHERE 
    PRICE_SUM >= 700000
ORDER BY 
    PRICE_SUM;

자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기

1) dictinct 테이블과 대여중인 car_id 테이블과 join

처음에 history테이블에서 '2022-10-16'일이 start_date와 end_date 안에 있으면 '대여중' 아니면 '대여 가능'으로 표시하도록 case when 으로 표현하다가 history 테이블이라 car_id가 여러개 나타나는 것을 확인하였다. 

그래서 where절로 대여중인 car_id 리스트를 뽑은 후, car_id 를 distinct한 테이블에 join한 후, 대여 중이 아닌 car_id를 '대여 가능'으로 표현하도록 작성하였다. 

SELECT DISTINCT a.CAR_ID AS car_id,
    CASE
        WHEN AVAILABILITY IS NULL THEN '대여 가능'
        ELSE '대여중'
    END AS AVAILABILITY
FROM
    CAR_RENTAL_COMPANY_RENTAL_HISTORY a
LEFT JOIN
    (SELECT
        CAR_ID,
        '대여중' AS AVAILABILITY
    FROM
        CAR_RENTAL_COMPANY_RENTAL_HISTORY
    WHERE
        DATE('2022-10-16') BETWEEN START_DATE AND END_DATE
    ) b 
ON a.CAR_ID = b.CAR_ID
ORDER BY 
    CAR_ID DESC;

2) group by + 대여 중인 car_id 테이블 서브쿼리 

다른 문제 풀이 방법으로는 서브쿼리로 2022-10-16일이 대여 시작일자와 종료 일자 사이에 있는 CAR_ID 리스트를 구한 후,

GROUP BY로 CAR_ID 별로 묶어 CAR_ID가 대여 가능 CAR_ID 리스트 안에 있으면 '대여중'으로 그렇지 않으면 '대여 가능'으로 표시하도록 CASE WHEN으로 표현할 수 있다. 

SELECT CAR_ID, 
    CASE
        WHEN CAR_ID IN (SELECT CAR_ID
                        FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
                        WHERE '2022-10-16' BETWEEN START_DATE AND END_DATE) THEN '대여중'
        ELSE '대여 가능'
    END "AVAILABILITY"
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC

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

SELECT MONTH(START_DATE) AS MONTH, CAR_ID, COUNT(*) AS RECORDS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE BETWEEN DATE('2022-08-01') AND DATE('2022-10-31')
    AND CAR_ID IN (
        SELECT CAR_ID
        FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
        WHERE START_DATE BETWEEN DATE('2022-08-01') AND DATE('2022-10-31')
        GROUP BY CAR_ID
        HAVING COUNT(CAR_ID) >= 5
        )
GROUP BY MONTH(START_DATE), CAR_ID
HAVING COUNT(*) > 0
ORDER BY MONTH, CAR_ID DESC ;