안녕하세요! 데코입니다!
오늘은 프로그래머스 코딩테스트 연습에 있는 "흉부외과 또는 일반외과 의사 목록 출력하기" 문제를 포스팅하려고 합니다!
바로 포스팅 시작할게요! :)
(출처 : https://school.programmers.co.kr/learn/courses/30/lessons/132203)
1. 문제 : 흉부외과 또는 일반외과 의사 목록 출력하기(Lv. 1)
2. 문제 설명
다음은 종합병원에 속한 의사 정보를 담은 DOCTOR 테이블입니다.
DOCTOR 테이블은 다음과 같으며 DR_NAME, DR_ID, LCNS_NO, HIRE_YMD, MCDP_CD, TLNO는 각각
의사이름, 의사ID, 면허번호, 고용일자, 진료과코드, 전화번호를 나타냅니다.
[ 테이블 구조('DOCTOR') ]
COLUMN NAME | TYPE | NULLABLE |
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 |
[ 문제 ]
DOCTOR 테이블에서 진료과가 흉부외과(CS)이거나 일반외과(GS)인
의사의 이름, 의사ID, 진료과, 고용일자를 조회하는 SQL문을 작성해주세요.
이때 결과는 고용일자를 기준으로 내림차순 정렬하고,
고용일자가 같다면 이름을 기준으로 오름차순 정렬해주세요.
[ 예시 ]
DOCTOR 테이블이 다음과 같다면
[ 테이블 : DOCTOR ]
DR_NAME | DR_ID | LCNS_NO | HIRE_YMD | MCDP_CD | TLNO |
루피 | DR20090029 | LC00010001 | 2009-03-01 | CS | 01085482011 |
패티 | DR20090001 | LC00010901 | 2009-07-01 | CS | 01085220122 |
뽀로로 | DR20170123 | LC00091201 | 2017-03-01 | GS | 01034969210 |
티거 | DR20100011 | LC00011201 | 2010-03-01 | NP | 01034229818 |
품바 | DR20090231 | LC00011302 | 2015-11-01 | OS | 01049840278 |
티몬 | DR20090112 | LC00011162 | 2010-03-01 | FM | 01094622190 |
니모 | DR20200012 | LC00911162 | 2020-03-01 | CS | 01089483921 |
오로라 | DR20100031 | LC00010327 | 2010-03-01 | OS | 01098428957 |
자스민 | DR20100032 | LC00010192 | 2010-03-01 | GS | 01023981922 |
벨 | DF20100039 | LC00010562 | 2010-07-01 | GS | 01058390758 |
SQL을 실행하면 다음과 같이 출력되어야 합니다.
[ 출력 결과 ]
DR_NAME | DR_ID | MCDP_CD | HIRE_YMD |
니모 | DR20200012 | CS | 2020-03-01 |
뽀로로 | DR20170123 | GS | 2017-03-01 |
벨 | DR20100039 | GS | 2010-07-01 |
자스민 | DR20100032 | GS | 2010-03-01 |
패티 | DR20090001 | CS | 2009-07-01 |
루피 | DR20090029 | CS | 2009-03-01 |
[ 출력 결과 ]
날짜 포맷은 예시와 동일하게 나와야합니다.
3. 문제 풀이
-- 1안
SELECT DR_NAME
, DR_ID
, MCDP_CD
, DATE_FORMAT(HIRE_YMD, '%Y-%m-%d')
FROM DOCTOR
WHERE MCDP_CD IN('CS', 'GS')
ORDER
BY HIRE_YMD DESC
, DR_NAME ASC
이번 문제는 1안 한 가지로 작성했습니다!
# 1안 풀이 설명
# [ 문제 접근 설명 ]
문제를 읽고 조건에 맞는 쿼리를 작성하기 위해서 다음과 같이 네 가지 단계로 진행했어요!
1. DOCTOR 테이블에서 조건에 맞는 데이터 필터링(WHERE)
2. 필요한 컬럼 선택(SELECT)
3. 날짜 포맷 설정
4. 고용일자 기준으로 내림차순 정렬, 의사 이름 기준으로 오름차순 정렬
# [ 1안 쿼리 작성 설명 ]
1 첫 번째 단계에서는 DOCTOR 테이블에서
WHERE절에서 조건에 맞는 데이터만 조회가 되도록
조건 필터링을 걸어주었습니다!
조건 : 진료과 코드가 '흉부외과' 혹은 '일반외과'인 데이터 (MCDP_CD IN ( 'CS', 'GS'))
SELECT *
FROM DOCTOR
WHERE MCDP_CD IN('CS', 'GS')
2 두 번째 작업은 SELECT 문에서 필요한 컬럼을 불러왔습니다!
불러온 컬럼들의 정보는 아래와 같습니다.
- 의사 이름(DR_NAME)
- 의사 ID(DR_ID)
- 진료과 코드(MCDP_CD)
- 고용일자(HIRE_YMD)
SELECT DR_NAME
, DR_ID
, MCDP_CD
, HIRE_YMD
FROM DOCTOR
WHERE MCDP_CD IN('CS', 'GS')
3 세 번째 작업은 SELECT 문에서 HIRE_YMD 컬럼의 날짜 포맷을 변경하였습니다!
DATE_FORMAT() 함수를 이용해서 '2020-03-01'와 같은 형식으로 변환해 주었습니다.
SELECT DR_NAME
, DR_ID
, MCDP_CD
, DATE_FORMAT(HIRE_YMD, '%Y-%m-%d') AS HIRE_YMD
FROM DOCTOR
WHERE MCDP_CD IN('CS', 'GS')
4 마지막으로는 요구사항에 맞게 정렬했어요!
고용일자(HIRE_YMD) 기준으로 내림차순
의사 이름(DR_NAME) 기준으로 오름차순 정렬했습니다!
SELECT DR_NAME
, DR_ID
, MCDP_CD
, DATE_FORMAT(HIRE_YMD, '%Y-%m-%d') AS HIRE_YMD
FROM DOCTOR
WHERE MCDP_CD IN('CS', 'GS')
ORDER
BY HIRE_YMD DESC
, DR_NAME ASC
4. 데코의 문제 풀이 후기
이번 문제는 WHERE문에서 필터링을 하고 정렬하고
특정 컬럼의 DATE 형식을 바꿔주기만 하면 되는 어렵지 않은 문제였습니다!
이 문제 또한 이전 문제들에서 전부 다룬 방법들을 통해 문제를 풀어서
따로 코멘트할 것은 없습니다!
혹시나 더 좋은 쿼리나 어렵게 느껴지신 부분이 있다면 댓글로 남겨주세요!
이번 문제는 요구사항에 맞게 간단한 쿼리를 작성해 보았습니다!
설명이 어려운 부분 혹은 잘 이해가 안 가는 부분
그리고 더 궁금한 내용이 있다면
언제든지 댓글로 남겨주세요!
빠르게 궁금증을 해결해 드릴게요!
공감과 댓글은 큰 힘이 됩니다!
오늘도 블로그 방문해 주시고
포스팅 읽어주셔서 감사합니다!
'Skill Sets > SQL' 카테고리의 다른 글
[SQL] 상품 별 오프라인 매출 구하기(프로그래머스/MySQL/Level 2) (73) | 2023.10.17 |
---|---|
[SQL] 진료과별 총 예약 횟수 출력하기(프로그래머스/MySQL/Level 2) (60) | 2023.09.19 |
[SQL] 취소되지 않은 진료 예약 조회하기(프로그래머스/MySQL/Level 4) (51) | 2023.09.01 |
[SQL] 카테고리 별 도서 판매량 집계하기(프로그래머스/MySQL/Level 3) (33) | 2023.07.16 |
[SQL] 저자 별 카테고리 별 매출액 집계하기(프로그래머스/MySQL/Level 4) (34) | 2023.07.10 |