신이 되고 싶은 갓지이

SQL 코테 연습 프로그래머스 Lv.4 문제풀이 2 - 오류 추후 수정 필요 본문

SQL

SQL 코테 연습 프로그래머스 Lv.4 문제풀이 2 - 오류 추후 수정 필요

갓지이 2025. 2. 13. 14:39

1. 취소되지 않은 진료 예약 조회하기 (STRING, DATE) 정답률 : 78%

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

문제

PATIENT, DOCTOR 그리고 APPOINTMENT 테이블에서 2022년 4월 13일 취소되지 않은 흉부외과(CS) 진료 예약 내역을 조회하는 SQL문을 작성해주세요. 진료예약번호, 환자이름, 환자번호, 진료과코드, 의사이름, 진료예약일시 항목이 출력되도록 작성해주세요. 결과는 진료예약일시를 기준으로 오름차순 정렬해주세요.

 

테이블이 3개인것 말고는 크게 다른 JOIN 문제와 다를게 없는 문제이다. DATE. 형식의 데이터에서 연월일만 잘 뽑아낸다면 어렵지 않다. 

나는 DATE_FORAMT(항목, "%Y%m%D")를 통해 DATE 데이터에서 연월일만 뽑아왔다. 

-- 1. 한번에 JOIN 후 조건 맞춰서 추출
SELECT A.APNT_NO, P.PT_NAME, A.PT_NO, A.MCDP_CD, D.DR_NAME, A.APNT_YMD
FROM APPOINTMENT A
LEFT JOIN PATIENT P
    ON A.PT_NO=P.PT_NO
LEFT JOIN DOCTOR D
    ON A.MDDR_ID=D.DR_ID
WHERE APNT_CNCL_YN='N' AND D.MCDP_CD='CS' AND DATE_FORMAT(APNT_YMD,"%Y%m%D") = 20220413
ORDER BY APNT_YMD

 

 

 

2. 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기(JOIN)  정답률 : 48%

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

문제

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를 기준으로 내림차순 정렬해주세요.

 

 

우선 JOIN 문제답게 어느 테이블에 어떻게 JOIN을 해야 하는지 부터 확인했다. 거기에 주어진 조건만 들고 올 수 있도록 where 절을 작성했고, 잘 가져와졌는지 확인했다. 테이블은 렌탈 가능한 모든 차부터 시작하기에 CAR_RENTAL_COMPANY_CAR에 다른 두 테이블을 LEFT JOIN하였다. 

-- 1. JOIN 확인
SELECT C.CAR_ID, C.CAR_TYPE, START_DATE, END_DATE,DISCOUNT_RATE, D.DURATION_TYPE, DAILY_FEE
      , ROUND(DAILY_FEE*(1-DISCOUNT_RATE/100)*30) AS FEE
FROM CAR_RENTAL_COMPANY_CAR  C
LEFT JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY H
	ON H.CAR_ID = C.CAR_ID
LEFT JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN D
	ON C.CAR_TYPE=D.CAR_TYPE
WHERE C.CAR_TYPE IN('세단','SUV') AND (END_DATE < 20221101 OR START_DATE>20221130) 
	AND DURATION_TYPE='30일 이상'

 

다음으로는 마지막 조건인 FEE가 50만원 이상, 200만원 미만에 맞는 항목만 가져오고 ordering을 하는 조건을 작성하여 코드 실행했을땐 맞아 보였지만 제출에서는 오답이라고 하여 해당 코드가 어느 부분이 잘못 되었는지 확인중에 있다. 확인이 끝나면 바로 수정과 오답 이유를 추가 작성할 예정이다.

-- 2. 에러 발생..
SELECT CAR_ID, CAR_TYPE, FEE
FROM (
    SELECT C.CAR_ID, C.CAR_TYPE, START_DATE, END_DATE,DISCOUNT_RATE, D.DURATION_TYPE, DAILY_FEE
            , ROUND(DAILY_FEE*(1-DISCOUNT_RATE/100)*30) AS FEE
    FROM CAR_RENTAL_COMPANY_CAR  C
    LEFT JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY H
        ON H.CAR_ID = C.CAR_ID
    LEFT JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN D
        ON C.CAR_TYPE=D.CAR_TYPE 
WHERE C.CAR_TYPE IN('세단','SUV') AND (END_DATE <= '2022-11-01' OR START_DATE>='2022-11-30') AND DURATION_TYPE='30일 이상') A
WHERE FEE>=500000 AND FEE<2000000
GROUP BY 1
ORDER BY FEE DESC, CAR_TYPE, CAR_ID DESC