츄르사려고 코딩하는집사입니다.
1. [프로그래머스/SQL] 취소되지 않은 진료 예약 조회하기 오라클(Oracle)
2. 문제 출처
https://school.programmers.co.kr/learn/courses/30/lessons/132204
3. 문제
다음은 환자 정보를 담은 PATIENT 테이블과 의사 정보를 담은 DOCTOR 테이블, 그리고 진료 예약목록을 담은 APPOINMENT에 대한 테이블입니다. PATIENT 테이블은 다음과 같으며 PT_NO, PT_NAME, GEND_CD, AGE, TLNO는 각각 환자번호, 환자이름, 성별코드, 나이, 전화번호를 의미합니다.
Column nameTypeNullable
PT_NO | VARCHAR(N) | FALSE |
PT_NAME | VARCHAR(N) | FALSE |
GEND_CD | VARCHAR(N) | FALSE |
AGE | INTEGER | FALSE |
TLNO | VARCHAR(N) | TRUE |
DOCTOR 테이블은 다음과 같으며 DR_NAME, DR_ID, LCNS_NO, HIRE_YMD, MCDP_CD, TLNO는 각각 의사이름, 의사ID, 면허번호, 고용일자, 진료과코드, 전화번호를 나타냅니다.
Column nameTypeNullable
DR_NAME | VARCHAR(N) | FALSE |
DR_ID | VARCHAR(N) | FALSE |
LCNS_NO | VARCHAR(N) | FALSE |
HIRE_YMD | DATE | FALSE |
MCDP_CD | VARCHAR(N) | TRUE |
TLNO | VARCHAR(N) | TRUE |
APPOINTMENT 테이블은 다음과 같으며 APNT_YMD, APNT_NO, PT_NO, MCDP_CD, MDDR_ID, APNT_CNCL_YN, APNT_CNCL_YMD는 각각 진료 예약일시, 진료예약번호, 환자번호, 진료과코드, 의사ID, 예약취소여부, 예약취소날짜를 나타냅니다.
Column nameTypeNullable
APNT_YMD | TIMESTAMP | FALSE |
APNT_NO | INTEGER | FALSE |
PT_NO | VARCHAR(N) | FALSE |
MCDP_CD | VARCHAR(N) | FALSE |
MDDR_ID | VARCHAR(N) | FALSE |
APNT_CNCL_YN | VARCHAR(N) | TRUE |
APNT_CNCL_YMD | DATE | TRUE |
문제
PATIENT, DOCTOR 그리고 APPOINMENT 테이블에서 2022년 4월 13일 취소되지 않은 흉부외과(CS) 진료 예약 내역을 조회하는 SQL문을 작성해주세요. 진료예약번호, 환자이름, 환자번호, 진료과코드, 의사이름, 진료예약일시 항목이 출력되도록 작성해주세요. 결과는 진료예약일시를 기준으로 오름차순 정렬하고, 진료예약일시가 같다면 환자번호를 기준으로 오름차순 정렬해주세요.
예시
PATIENT 테이블이 다음과 같고,
PT_NOPT_NAMEGEND_CDAGETLNO
PT22000019 | 바라 | W | 10 | 01079068799 |
PT22000043 | 오스왈드 | M | 68 | 01031294124 |
PT22000052 | 제니 | W | 60 | NULL |
PT22000071 | 몬몬 | M | 31 | 01076489209 |
PT22000097 | 슈가 | M | 19 | NULL |
DOCTOR 테이블이 다음과 같고,
DR_NAMEDR_IDLCNS_NOHIRE_YMDMCDP_CDTLNO
루피 | DR20090029 | LC00010001 | 2009-03-01 | CS | 01085482011 |
니모 | DR20200012 | LC00911162 | 2020-03-01 | CS | 01089483921 |
핑크퐁 | DR20140011 | LC00082201 | 2014-03-01 | NP | 01098428957 |
젤라비 | DR20160031 | LC00340327 | 2016-11-01 | OB | 01023981922 |
토리 | DR20190129 | LC00099911 | 2019-03-01 | NS | 01058390758 |
APPOINTMENT 테이블이 다음과 같을 때,
APNT_YMDAPNT_NOPT_NOMCDP_CDMDDR_IDAPNT_CNCL_YNAPNT_CNCL_YMD
2022-04-13 12:30:00.000000 | 42 | PT22000071 | CS | DR20090029 | N | NULL |
2022-04-13 15:30:00.000000 | 43 | PT22000019 | CS | DR20200012 | N | NULL |
2022-04-13 09:00:00.000000 | 46 | PT22000043 | CS | DR20090029 | N | NULL |
2022-07-09 11:00:00.000000 | 74 | PT22000042 | NP | DR20100011 | N | NULL |
2022-12-13 12:30:00.000000 | 110 | PT22000097 | NP | DR20160011 | Y | 2022-12-03 |
SQL을 실행하면 다음과 같이 출력되어야 합니다.
APNT_NOPT_NAMEPT_NOMCDP_CDDR_NAMEAPNT_YMD
46 | 오스왈드 | PT22000043 | CS | 루피 | 2022-04-13 09:00:00.000000 |
42 | 몬몬 | PT22000071 | CS | 루피 | 2022-04-13 12:30:00.000000 |
42 | 바라 | PT22000001 | CS | 니모 | 2022-04-13 15:30:00.000000 |
4. 풀이
- 문제가 길지만 전혀 복잡한게 없다. 3개의 테이블을 조인해서 원하는 값만 가져오면 된다.
- 먼저, APPOINTMENT(AP) 테이블과 PATIENT(P) 테이블을 환자 번호를 기준으로 INNER JOIN을 한다.
- 그 다음, APPOINTMENT(AP) 테이블과 DOCTOR(D) 테이블을 의사 번호를 기준으로 INNER JOIN을 한다.
- 테이블을 구성한 다음, 진료일인 2022년 04월 13일인 것을 TO_CHAR 함수를 통해 WHERE 조건을 걸고, 취소되지 않은 데이터를 구분하는 예약 취소 여부가 N인 것과 예약 취소 날짜가 NULL인 것을 조건으로 건다.
- 그 후, 진료 날짜와 환자 번호를 기준으로 오름차순으로 정렬하여 원하는 컬럼을 가져오면 된다.
5. 소스 코드
SELECT AP.APNT_NO
, P.PT_NAME
, P.PT_NO
, AP.MCDP_CD
, D.DR_NAME
, AP.APNT_YMD
FROM APPOINTMENT AP
INNER JOIN PATIENT P ON P.PT_NO = AP.PT_NO
INNER JOIN DOCTOR D ON D.DR_ID = AP.MDDR_ID
WHERE TO_CHAR(AP.APNT_YMD, 'YYYYMMDD') = '20220413'
AND AP.APNT_CNCL_YN = 'N'
AND AP.APNT_CNCL_YMD IS NULL
ORDER BY AP.APNT_YMD, P.PT_NO
'알고리즘 > 프로그래머스SQL' 카테고리의 다른 글
[프로그래머스/SQL] 조건별로 분류하여 주문상태 출력하기 오라클(Oracle) (0) | 2022.10.20 |
---|---|
[프로그래머스/SQL] 12세 이하인 여자 환자 목록 출력하기 오라클(Oracle) (0) | 2022.10.20 |
[프로그래머스/SQL] 진료과별 총 예약 횟수 출력하기 오라클(Oracle) (0) | 2022.10.20 |
[프로그래머스/SQL] 흉부외과 또는 일반외과 의사 목록 출력하기 오라클(Oracle) (0) | 2022.10.20 |
[프로그래머스/SQL] 없어진 기록 찾기 오라클(Oracle) (0) | 2022.10.18 |
[프로그래머스/SQL] 보호소에서 중성화한 동물 오라클(Oracle) (0) | 2022.10.18 |
[프로그래머스/SQL] 입양 시각 구하기(1) 오라클(Oracle) (0) | 2022.10.17 |
[프로그래머스/SQL] 우유와 요거트가 담긴 장바구니 오라클(Oracle) (0) | 2022.10.15 |
최근댓글