[SQL] 132202 진료과별 총 예약횟수 조회하기
https://school.programmers.co.kr/learn/courses/30/lessons/132202
📌문제
- 2022년 5월에 예약한 환자 수를
- 진료과 코드 별로 조회하기
- 컬럼명 별칭
- 진료과별 예약한 환자수, 진료과 코드 순서로 오름차순
💡 정답 쿼리
-- 코드를 입력하세요
SELECT mcdp_cd AS "진료과코드", COUNT(pt_no) AS "5월예약건수"
FROM appointment
WHERE DATE_FORMAT(apnt_ymd, '%Y-%m') = '2022-05'
GROUP BY mcdp_cd
ORDER BY 2 ASC, 1 ASC;
또는
-- 코드를 입력하세요
SELECT mcdp_cd AS '진료과코드', COUNT(pt_no) AS '5월예약건수'
FROM appointment
WHERE YEAR(apnt_ymd) = '2022' AND MONTH(apnt_ymd) = '05'
GROUP BY mcdp_cd
ORDER BY 5월예약건수, 진료과코드
오답
쉬운 문제인데 굉장히 헷갈리는 요소가 많은 문제이다.
1. 별칭
SELECT절에 별칭(alias) 쓸 때 MySQL에서 컬럼 별칭은 작은따옴표(' ')가 아니라 큰따옴표(" ")나 백틱( ` `)을 쓴다.
작은따옴표는 문자열 리터럴을 감쌀 때 쓰니까 컬럼 별칭 감쌀 때는 혼동되지 않게 큰따옴표나 백틱을 사용하는 것이다.
그리고 AS 별칭 형태 쓸때 별칭에 띄어쓰기가 있는 경우는 큰 따옴표가 필수이다.
SELECT column_name AS "별칭"
-- 또는
SELECT column_name AS `별칭`
2. 날짜 필터링
- BETWEEN '2022-05-01' AND '2022-05-31 23:59:59'
- DATE_FORMAT(column, '%Y-%m') = '2022-05' 둘다 가능
- 단, 중요한 건 날짜 값은 항상 작은따옴표(' ')로 감싸야 한다.
3. ORDER BY 절에서 별칭 사용 여부
- 정렬에서 오답처리 된 사람들이 많았는데 ORDER BY 절에 '5월예약건수', '진료과코드'와 같이 작은따옴표로 감싸서 쓰면 오답이다.
- GROUP BY, ORDER BY, HAVING 절에 별칭을 쓸 경우 별칭 그대로 써 주거나 `별칭`과 같이 백틱(``)을 붙여서 써야 한다.
- '별칭' 이렇게 쓰면 별칭에 적힌 문자 그대로 ORDER BY를 하겠다는 의미이다.
- 이럴때는 그냥 ORDER BY 2, 1로 컬럼명 순서대로 쓰는 것이 좋다.
4. DISTINCT 사용 여부
COUNT(pt_no)
는 pt_no 컬럼이 NULL이 아닌 행의 개수를 세는 함수이다.
- 예약 건수는
COUNT(apnt_no)
또는COUNT(*)
- (중복 없는)예약 환자 수는
COUNT(DISTINCT pt_no)
써야 한다.
COUNT(DISTINCT(pt_no)) AS "5월예약건수" // ❌
COUNT(pt_no) AS "5월예약건수" // ✔️
함수 | 의미 | 특징 |
---|---|---|
| pt_no가 NULL 아닌 행 개수 | NULL인 행은 제외하고 세기 |
| 중복 없이 고유한 pt_no 개수 | 중복된 값은 한 번만 세고, NULL 제외 |
| 모든 행의 개수 (NULL 상관없음) | 테이블 내 조건에 맞는 모든 행 세기 |
5. 헷갈렸던 부분
이 문제는 5월에 예약을 취소했든 아니든 그냥 예약한 환자 수를 구하는 문제이다.
그래서 아래 조건은 필요 없다.
AND apnt_cncl_yn = 'N' // ❌