MyBatis

전체 개수 조회 to 조건 개수

99duuk 2024. 11. 19. 15:57

기존에 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)를 각각 컬럼으로 조회할 수 있음.