
카테고리: SQL · GROUP BY · DATE_FORMAT · ORDER BY
플랫폼: 프로그래머스
난이도: Level 2
문제 설명
다음은 종합병원의 진료 예약정보를 담은 APPOINTMENT 테이블입니다.
| Column name | Type | Nullable |
| --- | --- | --- |
| APNT\_YMD | TIMESTAMP | FALSE |
| APNT\_NO | NUMBER(5) | FALSE |
| PT\_NO | VARCHAR(10) | FALSE |
| MCDP\_CD | VARCHAR(6) | FALSE |
| MDDR\_ID | VARCHAR(10) | FALSE |
| APNT\_CNCL\_YN | VARCHAR(1) | TRUE |
| APNT\_CNCL\_YMD | DATE | TRUE |APPOINTMENT 테이블에서 2022년 5월에 예약한 환자 수를 진료과코드 별로 조회하는 SQL문을 작성해주세요.
컬럼명은 '진료과 코드', '5월예약건수'로 지정하고, 진료과별 예약한 환자 수를 기준으로 오름차순 정렬하되, 예약한 환자 수가 같다면 진료과 코드를 기준으로 오름차순 정렬해주세요.
예시
입력
| APNT\_YMD | APNT\_NO | PT\_NO | MCDP\_CD | MDDR\_ID | APNT\_CNCL\_YN | APNT\_CNCL\_YMD |
| --- | --- | --- | --- | --- | --- | --- |
| 2022-04-14 09:30:00 | 47 | PT22000064 | GS | DR20170123 | N | NULL |
| 2022-04-15 10:30:00 | 48 | PT22000065 | OB | DR20100231 | N | NULL |
| 2022-05-15 17:30:00 | 49 | PT22000086 | OB | DR20100231 | N | NULL |
| 2022-05-18 10:30:00 | 52 | PT22000019 | GS | DR20100039 | N | NULL |
| 2022-05-19 12:00:00 | 53 | PT22000020 | FM | DR20010112 | N | NULL |
| 2022-05-22 08:30:00 | 54 | PT22000021 | GS | DR20100039 | N | NULL |
| 2022-05-04 10:30:00 | 56 | PT22000023 | FM | DR20090112 | N | NULL |
| 2022-05-14 15:30:00 | 57 | PT22000074 | CS | DR20200012 | N | NULL |
| 2022-05-24 15:30:00 | 58 | PT22000085 | CS | DR20200012 | N | NULL |
| 2022-05-28 10:00:00 | 60 | PT22000092 | OS | DR20100031 | N | NULL |출력
| 진료과코드 | 5월예약건수 |
| --- | --- |
| OB | 1 |
| OS | 1 |
| CS | 2 |
| FM | 2 |
| GS | 2 |내 풀이
SELECT
MCDP_CD AS '진료과 코드',
COUNT(*) AS '5월예약건수'
FROM APPOINTMENT
WHERE DATE_FORMAT(APNT_YMD, '%Y-%m') = '2022-05'
GROUP BY MCDP_CD
ORDER BY COUNT(*) ASC, MCDP_CD ASC;공부 포인트
1. DATE_FORMAT() 으로 날짜 필터링
APNT_YMD는 TIMESTAMP 타입이므로 연월 단위로 비교하려면DATE_FORMAT()으로 포맷을 맞춰줘야 함DATE_FORMAT(APNT_YMD, '%Y-%m') = '2022-05'로 2022년 5월 데이터만 필터링YEAR(APNT_YMD) = 2022 AND MONTH(APNT_YMD) = 5로 작성해도 동일한 결과를 얻을 수 있음
2. 다중 정렬 (ORDER BY)
ORDER BY COUNT(*) ASC, MCDP_CD ASC처럼 콤마로 구분하여 정렬 기준을 여러 개 지정할 수 있음- 앞에 있는 기준이 같을 경우 다음 기준으로 정렬함
추가 팁
COUNT()는COUNT(*)로 쓰는 것이 일반적입니다.COUNT(컬럼명)은 해당 컬럼의 NULL을 제외하고 세지만,COUNT(*)는 행 전체를 세기 때문에 예약 건수를 셀 때는COUNT(*)가 더 명확합니다.DATE_FORMAT대신BETWEEN을 활용하는 방법도 있습니다.WHERE APNT_YMD BETWEEN '2022-05-01' AND '2022-05-31 23:59:59'
마무리 요약
이번 문제는 DATE_FORMAT() 으로 날짜를 필터링하고 GROUP BY 와 다중 ORDER BY 를 조합하는 실무형 SQL 예제다.
날짜 타입 필터링 방법과 다중 정렬 기준 설정은 데이터 분석 시 자주 쓰이는 핵심 패턴이므로 꼭 익혀두는 것이 좋다.
이상입니다. 혹시나 제가 잘못된 내용을 작성했거나 더 좋은 방법이 있다면 댓글 남겨주세요.
지금까지 이 글을 봐주셔서 감사합니다.
'코딩테스트 > SQL' 카테고리의 다른 글
| [프로그래머스_SQL] Lv.2 가격이 제일 비싼 식품의 정보 출력하기 (0) | 2026.03.21 |
|---|---|
| [프로그래머스_SQL] Lv.1 조건에 맞는 아이템들의 가격의 총합 구하기 (0) | 2026.03.17 |
| [프로그래머스_SQL] Lv.1 잡은 물고기 중 가장 큰 물고기의 길이 구하기 (0) | 2026.03.16 |
| [프로그래머스_SQL] Lv.2 동명 동물 수 찾기 (0) | 2026.03.15 |