기존에 COUNT(*)로 전체 개수를 구했는데.
특정 조건에 따라 개수를 구하고 싶을 때는 CASE 문을 활용해 한 번의 쿼리로 각각 조건별 개수를 구할 수 있음.
기존 쿼리 : 전체 개수 조회
SELECT COUNT(*)
FROM your_table
INNER JOIN ...
WHERE no IN ('a', 'b')
AND ...
AND ...;
결과는 10이 나왔음
이 쿼리는 no가 'a' 또는 'b'인 전체 행의 개수, 즉 10을 반환함
조건별 개수를 구하는 쿼리
이제, 조건에 따라 'a'와 'b' 각각의 개수를 구하고 싶다면 CASE 문을 사용해 한 번의 쿼리로 해결할 수 있음.
SELECT
COUNT(CASE WHEN no = 'a' THEN 1 END) AS ACount, -- 'a'인 행의 개수
COUNT(CASE WHEN no = 'b' THEN 1 END) AS BCount -- 'b'인 행의 개수
FROM your_table
INNER JOIN ...
WHERE no IN ('a', 'b')
AND ...
AND ...;
이러면 결과는
ACount : 6, BCount : 4
라고 나옴
이 결과는 다음을 의미함:
- no가 'a'인 행의 개수는 6
- no가 'b'인 행의 개수는 4
COUNT(CASE WHEN no = 'a' THEN 1 END) AS ACount: no가 'a'인 경우에만 1을 반환하고, 그렇지 않은 경우에는 NULL을 반환하여 'a' 상태인 행만 카운트함.
COUNT(CASE WHEN no = 'b' THEN 1 END) AS BCount: no가 'b'인 경우에만 1을 반환하여 'b' 상태인 행만 카운트함.
이렇게 작성하면 쿼리를 분리하지 않고도 한 번에 조건별 개수(ACount와 BCount)를 각각 컬럼으로 조회할 수 있음.
'MyBatis' 카테고리의 다른 글
INTERVAL (1) | 2024.11.19 |
---|---|
MyBatis는 쿼리 결과를 DTO에 매핑할 때 setter 메소드를 사용함 (0) | 2024.09.23 |
LPAD, NEXTVAL (ID 관리) (0) | 2024.09.09 |
계층 쿼리 (중첩 SELECT_mysql, CTE_mysql, CONNECT BY_oracle) (0) | 2024.09.09 |
@변수명 := (0) | 2024.09.09 |