민규의 흔적

[오라클 SQL] 프로그래머스 - 12세 이하인 여자 환자 목록 출력하기 본문

프로그래머스 SQL

[오라클 SQL] 프로그래머스 - 12세 이하인 여자 환자 목록 출력하기

민규링 2023. 10. 19. 22:27

지적 및 질문은 언제나 환영입니다 !

 

2023년 10월 19일

문제 링크 : 프로그래머스 - 12세 이하인 여자 환자 목록 출력하기

 

문제 설명

다음은 종합병원에 등록된 환자정보를 담은 PATIENT 테이블입니다. PATIENT 테이블은 다음과 같으며 PT_NO, PT_NAME, GEND_CD, AGE, TLNO는 각각 환자번호, 환자이름, 성별코드, 나이, 전화번호를 의미합니다.

 

 

 

문제

PATIENT 테이블에서 12세 이하인 여자환자의 환자이름, 환자번호, 성별코드, 나이, 전화번호를 조회하는 SQL문을 작성해주세요. 이때 전화번호가 없는 경우, 'NONE'으로 출력시켜 주시고 결과는 나이를 기준으로 내림차순 정렬하고, 나이 같다면 환자이름을 기준으로 오름차순 정렬해주세요.

 

입력 예시

PATIENT 테이블이 다음과 같다고 가정.

 

 

출력 예시

SQL을 실행하면 다음과 같이 출력되어야 한다.

 

 


 

TABLE 생성

CREATE TABLE PATIENT(
       PT_NO VARCHAR(10) NOT NULL,
       PT_NAME VARCHAR(20) NOT NULL,
       GEND_CD VARCHAR(1) NOT NULL, \
       AGE NUMBER NOT NULL,
       TLNO VARCHAR(50),
       PRIMARY KEY(PT_NO)
);

 

예시 데이터 삽입

INSERT INTO PATIENT VALUES('PT22000003', '브라운', 'M', 18, '01031246641');
INSERT INTO PATIENT VALUES('PT22000004', '크롱', 'M', 7, NULL);
INSERT INTO PATIENT VALUES('PT22000006', '뽀뽀', 'W', 8, NULL);
INSERT INTO PATIENT VALUES('PT22000009', '한나', 'W', 12 ,'01032323117');
INSERT INTO PATIENT VALUES('PT22000012', '뿡뿡이', 'M', 5, NULL);
INSERT INTO PATIENT VALUES('PT22000013', '크리스', 'M', 30,'01059341192');
INSERT INTO PATIENT VALUES('PT22000014', '토프', 'W', 22,'01039458213');
INSERT INTO PATIENT VALUES('PT22000018', '안나', 'W', 11,NULL);
INSERT INTO PATIENT VALUES('PT22000019', '바라', 'W', 10,'01079068799');
INSERT INTO PATIENT VALUES('PT22000021', '릴로', 'W', 33,'01023290767');

 


 

질의 요구사항

  1. 환자의 환자이름, 환자번호, 성별코드, 나이, 전화번호를 조회
  2. 조회할 환자는 12세 이하의 여자환자
  3. 만약 전화번호가 없다면 전화번호(TLNO) 애트리뷰트 값을 'NONE'으로 출력
  4. 결과 릴레이션에서 나이를 기준으로 내림차순 정렬, 나이가 같다면 환자이름을 기준으로 오름차순 정렬

 

SQL 쿼리문 작성

 

질의 요구사항대로 쿼리문을 하나씩 작성해보며 접근해보겠다.

 

1. 환자의 환자이름, 환자번호, 성별코드, 나이, 전화번호를 조회

 

PATIENT 릴레이션에서 순서대로 PT_NAME, PT_NO, GEND_CD, AGE, TLNO 애트리뷰트 값을 갖는 모든 환자의 정보를 출력

 

쿼리문

SELECT PT_NAME, PT_NO, GEND_CD, AGE, TLNO
FROM PATIENT;

 

1번 질의 결과 릴레이션

 

 

2. 조회할 환자는 12세 이하의 여자환자

 

1번 쿼리문에서 조건을 추가하여 AGE가 12 이하이며 성별코드가 'W'인 환자 목록을 출력하게끔 한다.

 

쿼리문

SELECT PT_NAME, PT_NO, GEND_CD, AGE, TLNO
FROM PATIENT
WHERE AGE <= 12 AND GEND_CD = 'W';

 

2번 질의 결과 릴레이션

 

3. 만약 전화번호가 없다면 전화번호(TLNO) 애트리뷰트 값을 'NONE'으로 출력

 

특정 애트리뷰트의 값이 NULL이면 대체값으로 출력하는 함수인 NVL 함수를 사용한다.

 

 

NVL 함수 포맷

NVL(NULL 판단 대상, 'NULL일 때 대체값')

 

TLNO 애트리뷰트 값이 NULL이면 'NONE'을 출력하게끔 유도해야 한다.

NVL 함수를 사용하여 질의문을 작성하면 된다.

 

 

쿼리문

SELECT PT_NAME, PT_NO, GEND_CD, AGE, NVL(TLNO, 'NONE') TLNO
FROM PATIENT
WHERE AGE <= 12 AND GEND_CD = 'W';

 

3번 질의 결과 릴레이션

 

4. 결과 릴레이션에서 나이를 기준으로 내림차순 정렬, 나이가 같다면 환자이름을 기준으로 오름차순 정렬

 

오름차순, 내림차순 기준은 ORDER BY절에 추가하여 선언한다.

나이를 우선적으로 기준으로 삼아 내림차순(DESC), 나이가 같을 시 환자이름을 기준으로 내림차순(ASC)

 

쿼리문

SELECT PT_NAME,PT_NO, GEND_CD, AGE, NVL(TLNO, 'NONE') TLNO
FROM PATIENT
WHERE AGE <= 12 AND GEND_CD = 'W'

ORDER BY AGE DESC, PT_NAME ASC;

 

4번 질의 결과 릴레이션

 

 

4번 질의에 대한 쿼리문을 끝으로, 문제가 요구하는 결과 릴레이션 도출에 성공하였다.

 


 

풀이 후기

 

오름차순, 내림차순, NULL 값에 대한 NVL 함수 사용법을 숙지한다면 어렵지 않게 풀 수 있는 실렉션 문제이다.

 

 

 

 

지적 및 질문은 언제나 환영입니다 !