[프로그래머스/MySQL] 취소되지 않은 진료 예약 조회하기

지누초이·2024년 3월 29일

프로그래머스

목록 보기
35/37
post-thumbnail

문제

https://school.programmers.co.kr/learn/courses/30/lessons/132204


노트

복잡해보이는 문제일수록 차근차근 해결해보자.
2022년 4월 13일에 취소되지 않은 CS 진료 예약 내역을 통해 환자 이름, 의사 이름 등을 구해야한다.

테이블의 구조를 먼저 살펴보면,
예약 내역 테이블과 환자 테이블은 PT_NO 를 공유하며
예약 내역 테이블과 의사 테이블은 DR_ID 를 공유하고 있다.
그러면 예약 내역 테이블에서 조건을 만족하는 레코드의 PT_NODR_ID 를 구하면 해당 환자와 의사의 나머지 정보도 알 수 있게된다.

예약 내역 테이블에서 2022년 4월 13일에 취소되지 않은 CS 진료 예약 내역을 조회해보자.

WITH APP_AVAIL AS (
    SELECT
        APNT_NO
        , PT_NO
        , MDDR_ID
        , APNT_YMD
    FROM
        APPOINTMENT 
    WHERE
        DATE_FORMAT(APNT_YMD, '%Y-%m-%d') LIKE '2022-04-13%'
        AND APNT_CNCL_YN = 'N'
)

위 조회 쿼리에서 APNT_NOAPNT_YMD 는 결과 출력 용도이지 다른 테이블과의 JOIN 용도는 아니다.

이제 환자, 의사 테이블과 앞서 말한 공유하는 컬럼을 통해 JOIN을 해보자.
공통된 부분을 조회해야하므로 INNER JOIN 이고 간단히 WHERE 절에서 다룬다.

별개로
문제에서는 흉부외과(CS)의 진료 내역을 추출하라고했지만
진료과 코드에 대해 별도로 조건을 걸지않아도 통과는 된다.


정답

WITH APP_AVAIL AS (
    SELECT
        APNT_NO
        , PT_NO
        , MDDR_ID
        , APNT_YMD
    FROM
        APPOINTMENT 
    WHERE
        DATE_FORMAT(APNT_YMD, '%Y-%m-%d') LIKE '2022-04-13%'
        AND APNT_CNCL_YN = 'N'
)

SELECT
    C.APNT_NO
    , A.PT_NAME
    , C.PT_NO
    , B.MCDP_CD
    , B.DR_NAME
    , C.APNT_YMD
FROM
    PATIENT A
    , DOCTOR B
    , APP_AVAIL C
WHERE
    C.PT_NO = A.PT_NO
    AND C.MDDR_ID = B.DR_ID
    AND B.MCDP_CD = 'CS'
ORDER BY
    APNT_YMD

더 좋은 해결방법이 있다면 언제든 댓글로 알려주세요 🤗

0개의 댓글