본문 바로가기

Skill Sets/SQL

[SQL] 흉부외과 또는 일반외과 의사 목록 출력하기(프로그래머스/MySQL/Level 1)

SMALL

안녕하세요! 데코입니다!

 

오늘은 프로그래머스 코딩테스트 연습에 있는 "흉부외과 또는 일반외과 의사 목록 출력하기" 문제를 포스팅하려고 합니다!

 

바로 포스팅 시작할게요! :)

 

(출처 : 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 형식을 바꿔주기만 하면 되는 어렵지 않은 문제였습니다!

 

이 문제 또한 이전 문제들에서 전부 다룬 방법들을 통해 문제를 풀어서

 

따로 코멘트할 것은 없습니다!

 

혹시나 더 좋은 쿼리나 어렵게 느껴지신 부분이 있다면 댓글로 남겨주세요! 

 



이번 문제는 요구사항에 맞게 간단한 쿼리를 작성해 보았습니다!

설명이 어려운 부분 혹은 잘 이해가 안 가는 부분

그리고 더 궁금한 내용이 있다면

언제든지 댓글로 남겨주세요!

빠르게 궁금증을 해결해 드릴게요!

공감과 댓글은 큰 힘이 됩니다!

오늘도 블로그 방문해 주시고

포스팅 읽어주셔서 감사합니다!

 

 

LIST