https://school.programmers.co.kr/learn/courses/30/lessons/132202
-- 틀린 쿼리 (TO_DATE와 문자열을 비교해버림;;)
SELECT MCDP_CD , COUNT(APNT_NO)
FROM APPOINTMENT
WHERE TO_DATE(APNT_YMD, 'YYYY-MM') = '2022-05'
GROUP BY MCDP_CD;
-- 틀린 쿼리 (TO_DATE와 문자열을 비교해버림;;)
SELECT MCDP_CD , COUNT(APNT_NO)
FROM APPOINTMENT
WHERE TO_DATE(APNT_YMD, 'YYYY-MM') = '2022-05'
GROUP BY MCDP_CD;
-- 정답 쿼리 (날짜 비교는 범위 조건을 사용해야함 BETWEEN 또는 >= AND <) + alias 문자열로할때는 쌍따옴표 또는 생략 (홑따옴표 아님)
-- 쌍 따옴표를 쓰면 대소문자 구분되므로 주의
SELECT MCDP_CD AS "진료과코드" , COUNT(APNT_NO) AS "5월예약건수"
FROM APPOINTMENT
WHERE APNT_YMD >= TO_DATE('2022-05-01', 'YYYY-MM-DD') AND APNT_YMD < TO_DATE('2022-06-01', 'YYYY-MM-DD')
GROUP BY MCDP_CD
ORDER BY "5월예약건수", "진료과코드";
-- CAST는 스칼라 함수로, 각 행마다 실행됨... 성능이 좋지 않으나, 쓸 수는 있다.
SELECT MCDP_CD AS "진료과코드", COUNT(APNT_NO) AS "5월예약건수"
FROM APPOINTMENT
WHERE CAST(APNT_YMD AS CHAR(7)) = '2022-05'
GROUP BY MCDP_CD
ORDER BY "5월예약건수", "진료과코드";
-- TO_CHAR도 가능
SELECT MCDP_CD AS "진료과코드", COUNT(APNT_NO) AS "5월예약건수"
FROM APPOINTMENT
WHERE TO_CHAR(APNT_YMD, 'YYYY-MM') = '2022-05'
GROUP BY MCDP_CD
ORDER BY "5월예약건수", "진료과코드";
-- 더 좋은 쿼리 (TRUNC 사용)
SELECT MCDP_CD AS "진료과코드" , COUNT(APNT_NO) AS "5월예약건수"
FROM APPOINTMENT
WHERE TRUNC(APNT_YMD, 'MM') = TO_DATE('2022-05', 'YYYY-MM')
GROUP BY MCDP_CD
ORDER BY "5월예약건수", "진료과코드";
-- 정답 쿼리 (날짜 범위 조건 사용)
SELECT MCDP_CD AS "진료과코드", COUNT(APNT_NO) AS "5월예약건수"
FROM APPOINTMENT
WHERE APNT_YMD >= '2022-05-01' AND APNT_YMD < '2022-06-01'
GROUP BY MCDP_CD
ORDER BY "5월예약건수", "진료과코드";
-- FORMAT 활용도 가능, 그러나 날짜를 비교하거나 범위를 필터링하기에는 FORMAT은 성능이 매우 낮다.
SELECT MCDP_CD AS "진료과코드", COUNT(APNT_NO) AS "5월예약건수"
FROM APPOINTMENT
WHERE FORMAT(APNT_YMD, 'yyyy-MM') = '2022-05'
GROUP BY MCDP_CD
ORDER BY "5월예약건수", "진료과코드";
-- 날짜는 범위조건
SELECT MCDP_CD AS "진료과코드", COUNT(APNT_NO) AS "5월예약건수"
FROM APPOINTMENT
WHERE APNT_YMD >= '2022-05-01' AND APNT_YMD < '2022-06-01'
GROUP BY MCDP_CD
ORDER BY "5월예약건수", "진료과코드";
-- 또는 DATEFROMPARTS 또는 EOMONTH 같은 날짜 함수를 사용하는 것이 좋다.
SELECT MCDP_CD AS "진료과코드", COUNT(APNT_NO) AS "5월예약건수"
FROM APPOINTMENT
WHERE APNT_YMD >= DATEFROMPARTS(2022, 5, 1)
AND APNT_YMD <= EOMONTH(DATEFROMPARTS(2022, 5, 1))
GROUP BY MCDP_CD
ORDER BY "5월예약건수", "진료과코드";