🌳 Before
월별 매출에 따른 성별 수 조회 방법을 알아봅니다.
🌳 After
🌾 해결 방법 :
COUNT(DISTINCT CASE WHEN C.gender = '남자' THEN B.id END)는 SQL 쿼리에서 사용되는 특별한 표현식입니다. 이 표현식은 다음과 같은 역할을 합니다.
CASE WHEN C.gender = '남자' THEN B.id END: 이 부분은 C.gender가 '남자'인 경우에는 B.id 값을 반환하고, 그렇지 않으면 NULL 값을 반환합니다. 즉, '남자'인 환자의 경우에만 해당 환자의 B.id 값을 가지고 오고, 그 외의 경우에는 NULL을 반환합니다.
COUNT(DISTINCT ...): 이 부분은 DISTINCT 키워드를 사용하여 중복된 값을 제거한 후, 그 결과의 개수를 세는 역할을 합니다. 즉, '남자'인 환자의 경우에만 해당하는 B.id 값을 중복 없이 세어서 그 개수를 반환합니다.
따라서 COUNT(DISTINCT CASE WHEN C.gender = '남자' THEN B.id END)는 '남자' 환자의 수를 세는 것을 의미합니다. 이러한 방식으로 특정 조건을 만족하는 행의 개수를 셀 수 있습니다.
// 성별
@Query(nativeQuery = true, value = " SELECT CONCAT(YEAR(B.reservationDate), '-', LPAD(MONTH(B.reservationDate), 2, '0')) AS `YEAR_MONTH`,\n" +
"SUM(A.cost) AS `SUM`,\n" +
"COUNT(DISTINCT B.id) AS `patientCount`,\n" +
"COUNT(DISTINCT CASE WHEN C.gender = '남자' THEN B.id END) AS `MaleCount`,\n" +
"COUNT(DISTINCT CASE WHEN C.gender = '여자' THEN B.id END) AS `FemaleCount`\n" +
"FROM `reservation` AS B\n" +
"JOIN `treatment_statement` AS A ON B.id = A.reservationId\n" +
"JOIN `patient` AS C ON B.patientId = C.id\n" +
"WHERE A.doctorId = :doctorId\n" +
"GROUP BY `YEAR_MONTH`\n" +
"ORDER BY `YEAR_MONTH` DESC;")
public List<DoctorGenderInterface> findGenderByDoctorId(
@Param("doctorId") int doctorId);
'코딩 에러 및 질문' 카테고리의 다른 글
발생한 예외의 종류에 상관없이 403 Forbidden 응답이 반환 With Spring Security (0) | 2023.09.17 |
---|---|
응답 헤더 없는 CORS 오류 with Spring Security (0) | 2023.09.17 |
Mysql - (년도 + 월) 합쳐서 조회하기 (0) | 2023.09.07 |
"could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet", (0) | 2023.09.07 |
return; 무한루프 (0) | 2023.09.07 |