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

2024. 2. 25. 16:41·Algorithm

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

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 ;

'Algorithm' 카테고리의 다른 글

<백준 13335 : 트럭> 문제풀이 with python  (4) 2024.11.09
[TIL] 99클럽 코테 스터디 13일차 TIL - 이진탐색 : 백준 10561 징검다리 문제 풀이 with python  (0) 2024.11.09
[TIL] 99클럽 코테 스터디 7일차 TIL - <프로그래머스 : 10561 징검다리> 문제 풀이 with python  (0) 2024.11.04
알고리즘 성능 평가 방법 - 빅오 표기법  (0) 2024.02.06
자료구조와 알고리즘의 개념  (2) 2024.02.06
'Algorithm' 카테고리의 다른 글
  • [TIL] 99클럽 코테 스터디 13일차 TIL - 이진탐색 : 백준 10561 징검다리 문제 풀이 with python
  • [TIL] 99클럽 코테 스터디 7일차 TIL - <프로그래머스 : 10561 징검다리> 문제 풀이 with python
  • 알고리즘 성능 평가 방법 - 빅오 표기법
  • 자료구조와 알고리즘의 개념
데이by데이
데이by데이
  • 데이by데이
    Carpe Diem
    데이by데이
  • 전체
    오늘
    어제
    • 분류 전체보기 (42)
      • AI (5)
      • 데이터분석 (5)
      • MLOps (2)
      • 프로젝트 (2)
      • Personal (5)
      • Algorithm (12)
      • TIL (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    유전알고리즘예제
    구간분할
    티스토리챌린지
    numpy
    데이터시각화
    causal discovery
    pc알고리즘
    오블완
    맹그로브고성
    지수표현변환
    시계열데이터분석
    과학적표기법
    인과발견
    Rag
    변화점찾기
    2025 다짐
    LLM
    2024 회고
    #99클럽 #코딩테스트준비 #개발자취업 #항해99 #til
    더나은프로그래머되는법
    ai대학원진학
    최적화알고리즘
    개발책추천
    change point analysis
    이상탐지
    Python
    AI
    유전알고리즘개념
    회고
    change point detection
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
데이by데이
[SQL] 프로그래머스 고득점 KIT GROUP BY 문제 정답
상단으로

티스토리툴바