ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ORACLE] 매일 5개. 프로그래머스 SQL 문제 풀기 챌린지 Day 16 (Final)
    Study/SQL 2024. 6. 17. 16:41
    728x90
    반응형

     

     

    매일 프로그래머스에서 제공하는 SQL 문제5개씩 해결하며, 데이터 베이스 관리 및 쿼리 작성 능력을 성장시키고자 합니다.

     

    또한, 오라클(Oracle) 데이터베이스를 사용하여 문제를 해결함으로써, 실제 업무 환경에서 마주칠 수 있는 다양한 상황에 대비하고자 합니다.

     

    매일 바쁜 일상 속에서 새로운 것을 배우고 성장하는 것은 어렵겠지만, 도전이라도 하면 어떨까 합니다.

     

    프로그래머스는 무료로 다양한 난이도의 문제를 제공하기 때문에, 저는 제일 낮은 난이도부터 정답률이 높은 순서대로 풀어 보려고 합니다.

     

     

    프로그래머스 문제 모음

    728x90

     

    마지막 2일은 3문제씩 풀었습니다.

     

     


    문제 풀이

    해당 문제에 대한 자세한 내용은 프로그래머스에서 찾아볼 수 있습니다!

     

     

     

    1. 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기

    CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블과 CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블에서 자동차 종류가 '세단' 또는 'SUV' 자동차 2022 11 1일부터 2022 11 30일까지 대여 가능하고 30일간의 대여 금액이 50만원 이상 200만원 미만인 자동차에 대해서 자동차 ID, 자동차 종류, 대여 금액(컬럼명: FEE) 리스트를 출력하는 SQL문을 작성해주세요.
    결과는 대여 금액을 기준으로 내림차순 정렬하고, 대여 금액이 같은 경우 자동차 종류를 기준으로 오름차순 정렬, 자동차 종류까지 같은 경우 자동차 ID 기준으로 내림차순 정렬해주세요.

     

    select car_id, car_type, fee
    from(    
        SELECT a.car_id, a.car_type, 30 * a.daily_fee * (100-c.discount_rate)/100 as fee
        from 
            CAR_RENTAL_COMPANY_CAR a, 
            CAR_RENTAL_COMPANY_RENTAL_HISTORY b, 
            CAR_RENTAL_COMPANY_DISCOUNT_PLAN c
        where 
            (a.car_id = b.car_id and a.car_type = c.car_type)
            and a.car_type in ('세단', 'SUV') 
            and a.car_id not in (
                    select car_id
                    from car_rental_company_rental_history
                    where to_char(start_date, 'yyyy-mm-dd') <= '2022-11-30'
                    and to_char(end_date, 'yyyy-mm-dd') > '2022-11-01')
            and c.duration_type = '30일 이상'
            and 30 * a.daily_fee * (100-c.discount_rate)/100 >= 500000
            and 30 * a.daily_fee * (100-c.discount_rate)/100 < 2000000
        )
     group by car_id, car_type, fee
     order by 3 desc, 2, 1 desc

     

     

     

     

    2. 자동차 대여 기록 별 대여 금액 구하기

    CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블과 CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블에서 자동차 종류가 '트럭' 자동차의 대여 기록에 대해서 대여 기록 별로 대여 금액(컬럼명: FEE) 구하여 대여 기록 ID 대여 금액 리스트를 출력하는 SQL문을 작성해주세요.
    결과는 대여 금액을 기준으로 내림차순 정렬하고, 대여 금액이 같은 경우 대여 기록 ID 기준으로 내림차순 정렬해주세요.

     

    with ab as (select history_id, daily_fee, b.end_date - b.start_date + 1 as duration_date,
        case when b.end_date - b.start_date + 1 between 7 and 29 then '7일 이상'
        when b.end_date - b.start_date + 1 between 30 and 89 then '30일 이상'
        when b.end_date - b.start_date + 1 >= 90 then '90일 이상'
        end as duration
    from CAR_RENTAL_COMPANY_CAR a, CAR_RENTAL_COMPANY_RENTAL_HISTORY b
    where a.car_id = b.car_id and a.car_type = '트럭'
    order by b.history_id)
    
    select history_id, daily_fee * duration_date * ((100 - nvl(discount_rate,0))/100) as fee
    from 
        (select *
        from CAR_RENTAL_COMPANY_DISCOUNT_PLAN
        where car_type = '트럭') c, ab
    where c.duration_type(+) = ab.duration
    order by 2 desc, 1 desc

     

    반응형

     

     

    3. 상품을 구매한 회원 비율 구하기

    USER_INFO 테이블과 ONLINE_SALE 테이블에서 2021년에 가입한 전체 회원들 상품을 구매한 회원수와 상품을 구매한 회원의 비율(=2021년에 가입한 회원 상품을 구매한 회원수 / 2021년에 가입한 전체 회원 ) , 별로 출력하는 SQL문을 작성해주세요.
    상품을 구매한 회원의 비율은 소수점 두번째자리에서 반올림하고, 전체 결과는 년을 기준으로 오름차순 정렬해주시고 년이 같다면 월을 기준으로 오름차순 정렬해주세요.

     

    SELECT to_char(b.sales_date, 'yyyy') as year, extract (month from b.sales_date) as month, count(distinct (a.user_id)) as purchased_user, round(count(distinct (a.user_id)) / (select count(*) from user_info where to_char(joined, 'yyyy') = '2021'), 1) as puchased_ratio
    from USER_INFO a, ONLINE_SALE b
    where a.user_id = b.user_id and to_char(a.joined, 'yyyy') = '2021'
    group by to_char(b.sales_date, 'yyyy'), extract (month from b.sales_date)
    order by 1, 2

     

     

     

     

    728x90
    반응형

    댓글

Designed by Tistory.