안녕하세요! 데코입니다!
오늘은 프로그래머스 코딩테스트 연습에 있는 "진료과별 총 예약 횟수 출력하기" 문제를 포스팅하려고 합니다!
바로 포스팅 시작할게요! :)
(출처 : 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 쿼리를 작성해 보았습니다!
설명이 어려운 부분 혹은 잘 이해가 안 가는 부분
그리고 더 궁금한 내용이 있다면
언제든지 댓글로 남겨주세요!
빠르게 궁금증을 해결해 드릴게요!
공감과 댓글은 큰 힘이 됩니다!
오늘도 블로그 방문해 주시고
포스팅 읽어주셔서 감사합니다!
'Skill Sets > SQL' 카테고리의 다른 글
[SQL] SQL 쿼리 양식 및 작성 규칙 (66) | 2023.10.21 |
---|---|
[SQL] 상품 별 오프라인 매출 구하기(프로그래머스/MySQL/Level 2) (73) | 2023.10.17 |
[SQL] 흉부외과 또는 일반외과 의사 목록 출력하기(프로그래머스/MySQL/Level 1) (70) | 2023.09.13 |
[SQL] 취소되지 않은 진료 예약 조회하기(프로그래머스/MySQL/Level 4) (51) | 2023.09.01 |
[SQL] 카테고리 별 도서 판매량 집계하기(프로그래머스/MySQL/Level 3) (33) | 2023.07.16 |