[SQL 문제 풀기] 진료과별 총 예약 횟수 출력하기(132202)

lhs's avatar
Dec 05, 2024
[SQL 문제 풀기] 진료과별 총 예약 횟수 출력하기(132202)
 

1. 문제 풀이 아이디어

  • WHERE 절에서 비교 연산을 사용하고, GROUP BY 절로 데이터를 그룹화한 뒤 COUNT 함수를 활용하여 문제를 해결할 수 있다.

2. 나의 정답 코드

SELECT mcdp_cd as `진료과코드`, count(*) as `5월예약건수` FROM appointment WHERE apnt_ymd BETWEEN '2022-05-01' AND '2022-05-31' GROUP BY mcdp_cd ORDER BY `5월예약건수`, `진료과코드`;

3. 정리

  • WHERE 절에서 BETWEEN 키워드를 사용해 5월에 해당하는 데이터를 필터링한다.
  • GROUP BY 절로 mcdp_cd를 기준으로 데이터를 그룹화하고, COUNT 함수를 사용해 각 그룹의 예약 건수를 계산한다.
  • ORDER BY 절을 통해 5월예약건수진료과코드를 기준으로 오름차순 정렬한다.

4. 다른 아이디어

apnt_ymd LIKE '2022-05%' left(apnt_ymd, 7) = '2022-05' year(apnt_ymd) = 2022 AND month(apnt_ymd) = 5 apnt_ymd BETWEEN '2022-05-01' AND '2022-05-31' '2022-05-01' <= apnt_ymd AND apnt_ymd < '2022-06-01'

1. LIKELEFT를 사용한 문자열 필터링

  • 장점
    • 간결하고 직관적.
    • 문자열 데이터나 DATETIME 타입 모두에 사용 가능.
  • 단점
    • LIKELEFT는 데이터베이스에서 DATETIME의 인덱스를 사용할 수 없음.
    • DATETIME 타입의 데이터를 문자열로 변환하여 비교하므로, 연산 비용이 증가.

2. YEARMONTH를 사용해 연도와 월을 추출

  • 장점
    • 의도가 명확하여 쿼리의 가독성이 높음.
    • 특정 연도와 월을 정확히 비교할 때 유용.
  • 단점
    • YEARMONTH는 함수 호출이므로, 데이터베이스는 인덱스를 사용할 수 없음.
    • 데이터의 양이 많을 경우 성능 저하 발생.

3. 범위 비교 연산 (BETWEEN 또는 범위 조건 <=, < 사용)

  • 장점
    • 범위 조건(BETWEEN이나 <=, <)은 데이터베이스에서 인덱스를 효율적으로 사용 가능.
    • 범위 검색은 함수 호출이나 변환 없이 DATETIME 타입 데이터를 직접 비교하므로 가장 효율적.
    • 데이터 타입(DATETIME)을 유지하여 연산 오버헤드 없이 필터링.

4. 결론

  • DATETIME 타입의 데이터를 필터링할 때는 가장 효율적인 방법으로 범위 비교 연산을 사용하는 것이 적합하다.
Share article

LHS's Study Space