본문 바로가기

Skill Sets/SQL

[SQL] 진료과별 총 예약 횟수 출력하기(프로그래머스/MySQL/Level 2)

SMALL

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

 

오늘은 프로그래머스 코딩테스트 연습에 있는 "진료과별 총 예약 횟수 출력하기" 문제를 포스팅하려고 합니다!

 

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

 

(출처 : https://school.programmers.co.kr/learn/courses/30/lessons/132202)


 

1. 문제 :  진료과별 총 예약 횟수 출력하기(Lv. 2)

 


 

2. 문제 설명

 

다음은 종합병원의 진료 예약정보를 담은 APPOINTMENT 테이블 입니다.
APPOINTMENT 테이블은 다음과 같며

APNT_YMD, APNT_NO, PT_NO, MCDP_CD, MDDR_ID, APNT_CNCL_YN, APNT_CNCL_YMD는 각각

진료예약일시, 진료예약번호, 환자번호, 진료과코드, 의사ID, 예약취소여부, 예약취소날짜를 나타냅니다.

 

[ 테이블 구조('APPOINTMENT') ]

COLUMN NAME TYPE NULLABLE
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

 

[ 문제 ]

 

APPOINTMENT 테이블에서

 2022년 5월에 예약한 환자 수를 진료과코드 별로 조회하는 SQL문을 작성해주세요.

이때, 컬럼명은 '진료과 코드', '5월예약건수'로 지정해주시고

결과는 진료과별 예약한 환자 수를 기준으로 오름차순 정렬하고,

예약한 환자 수가 같다면 진료과 코드를 기준으로 오름차순 정렬해주세요.

 

 

[ 예시 ]

 

APPOINTMENT 테이블이 다음과 같을 때

 

테이블 : APPOINTMENT ]

APNT_YMD APNT_NO PT_NO MCDP_CD MDDR_ID APNT_CNCL_YN APNT_CNCL_YMD
2022-04-14 09:30 47 PT22000064 GS DR20170123 N NULL
2022-04-15 10:30 48 PT22000065 OB DR20100231 N NULL
2022-05-15 17:30 49 PT22000086 OB DR20100231 N NULL
2022-05-18 10:30 52 PT22000019 GS DR20100039 N NULL
2022-05-19 12:00 53 PT22000020 FM DR20010112 N NULL
2022-05-22 08:30 54 PT22000021 GS DR20100039 N NULL
2022-05-04 10:30 56 PT22000023 FM DR20090112 N NULL
2022-05-14 15:30 57 PT22000074 CS DR20200012 N NULL
2022-05-24 15:30 58 PT22000085 CS DR20200012 N NULL
2022-05-28 10:00 60 PT22000092 OS DR20100031 N NULL

 

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

 

[ 출력 결과 ]

진료과코드 5월예약건수
OB 1
OS 1
CS 2
FM 2
GS 2

 

 


 

3. 문제 풀이

-- 1안
SELECT  MCDP_CD AS '진료과코드'
        , COUNT(*) AS '5월예약건수'
  FROM  APPOINTMENT
 WHERE  APNT_YMD >= '2022-05-01'
        AND APNT_YMD < '2022-06-01'
 GROUP
    BY  MCDP_CD
 ORDER
    BY  COUNT(*) ASC
        , MCDP_CD ASC

-- 2안
SELECT  MCDP_CD AS '진료과코드'
        , COUNT(*) AS '5월예약건수'
  FROM  APPOINTMENT
 WHERE  APNT_YMD LIKE '2022-05%'
 GROUP
    BY  MCDP_CD
 ORDER
    BY  COUNT(*) ASC
        , MCDP_CD ASC

 

이번 문제는 2안 두 가지로 작성했습니다!

 

WHERE 문제의 코드만 조금 다른 것이기 때문에 풀이 설명에 같이 설명을 할게요!

 

#  1안 & 2안 풀이 설명

# [ 문제 접근 설명 ]


문제를 읽고 조건에 맞는 쿼리를 작성하기 위해서 다음과 같이  세 가지 단계로 진행했어요!

1. APPOINTMENT 테이블에서 조건에 맞는 데이터 필터링(WHERE)
2. 집계 해주기(GROUP BY)
3. '5월예약횟수' 기준으로 오름차순 정렬, '진료코드' 기준으로 오름차순 정렬

 

# [ 1안 & 2안 쿼리 작성 설명 ]

 

 1  첫 번째 단계에서는 WHERE문을 통해서 필요로하는 데이터들을 필터링하였습니다!

 

APPOINTMENT 테이블의 예약일자(APNT_YMD)를 이용해서 2022년 5월의 데이터들만을 불러왔어요!

 

여기서 1안과 2안의 차이가 발생했는데,

 

1안은 AND를 이용해서 2022년 5월 1일 이상 & 2022년 6월 1일 미만의 예약들을 불러왔고

 

2안은 LIKE 문을 이용해서 '2022-05' 형식을 가지는 예약들을 불러왔습니다!

 

-- 1안
 SELECT   *
    FROM  APPOINTMENT
WHERE  APNT_YMD >= '2022-05-01'
                AND APNT_YMD < '2022-06-01'

-- 2안
SELECT   *
   FROM  APPOINTMENT
WHERE  APNT_YMD LIKE '2022-05%'

 

 2  두 번째 작업은 GROUP BY를 이용해서 진료과코드(MCDP_CD)별 데이터를 집계했습니다!

 

이후 SELECT에도 진료과코드(MCDP_CD) 그리고 COUNT(*)를 통해 진료과별 데이터 수를 생성하고

 

각각 문제에서 요구한 사항과 같이 '진료과코드', '5월예약건수' 이름으로 지정해주었습니다.

 

SELECT   MCDP_CD AS '진료과코드'
                 , COUNT(*) AS '5월예약건수'
    FROM  APPOINTMENT
WHERE  APNT_YMD >= '2022-05-01'
                AND APNT_YMD < '2022-06-01'
GROUP
        BY  MCDP_CD

 

 3  마지막으로는 요구사항에 맞게 정렬했어요!

'5월예약횟수' 기준으로 오름차순 정렬, '진료코드' 기준으로 오름차순 정렬했습니다!

 

SELECT   MCDP_CD AS '진료과코드'
                 , COUNT(*) AS '5월예약건수'
    FROM  APPOINTMENT
WHERE  APNT_YMD >= '2022-05-01'
                AND APNT_YMD < '2022-06-01'
GROUP
        BY  MCDP_CD
ORDER
        BY  COUNT(*) ASC
              , MCDP_CD ASC

 

정답...!


 

4. 데코의 문제 풀이 후기

이번 문제는 난이도 2단계의 문제로 원하는 데이터를 WHERE문을 통해 필터링이 가능한지

 

물어보는 어렵지 않은 문제였습니다!

 

병원 데이터에서 활용되는 것을 보여드리려고 포스팅을 작성했습니다!

 

이전 문제들에서 다 다룬 방법들을 통해 문제를 풀어서 따로 코멘트할 것은 없습니다!

 

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

 



이번 문제도 주어진 데이터를 요구사항에 맞게 SQL 쿼리를 작성해 보았습니다!

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

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

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

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

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

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

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

 

 

LIST