쉽게 쉽게

[MYSQL] select문에 count 여러개 본문

DB/MYSQL와 MariaDB

[MYSQL] select문에 count 여러개

곱마2 2024. 7. 4. 16:30
반응형

▤ 목차

    1. 이슈

    SELECT문 조회한 결과에 대한 COUNT()들을 같이 출력할 필요성이 생겼다.

    다만 COUNT 조건이 각기 달라서 이를 해결하기 위해 방안을 찾아봤다.

     

     1.  SELECT문 조회 쿼리

    ACT_TIME 테이블에는 활동시간과 종료시간 정보가,  REPORT_CONTENT 테이블에는 보고서 타입이 존재한다.

    이를 JOIN하여 유저별로 정보를 가져왔을 때, 아래와 같은 조회결과가 나오게 된다.

    이때, A타입의 보고서 수 , B타입의 보고서 수의 통계를 결과와 함께 추출해야 한다.

    SELECT
    		RC.CONTENT_TYPE, /* 보고서 타입 (A, B 타입존재) */
    		AT.ACT_DATE, /* 활동일 */
    		AT.START_TIME, /* 활동시간 */
    		AT.END_TIME /* 종료시간 */
    FROM
    		ACT_TIME AT
    	INNER JOIN REPORT_CONTENT RC ON
    		RC.content_idx = AT.content_idx
    	WHERE
    		AT.user_code = ???
    		AND AT.report_idx = ???

    2. SELECT문에서 여러 개의 COUNT() 값만 조회할 경우

    1. COUNT() 조건 설정

    COUNT() 통계만 추출하면 될 경우에는 원하는 조건을 설정하여 COUNT() 값을 추출하면 된다.

    • CASE WHEN을 이용
    • COUNT()와 GROUP BY를 이용

    단 COUNT()를 추가하면  통계값은 구할 수 있을지 몰라도 SELECT 조회값을 상실하게 된다.

    // 1. CASE WHEN 사용
    SELECT
    	COUNT(CASE WHEN RC.act_type = 'A' THEN 1 END) AS Acnt,
    	COUNT(CASE WHEN RC.act_type = 'B' THEN 1 END) AS Bcnt
    FROM
    		ACT_TIME AT
    	INNER JOIN REPORT_CONTENT RC ON
    		RC.content_idx = AT.content_idx
    	WHERE
    		AT.user_code = ???
    		AND AT.report_idx = ???
         
    // 2. COUNT()와 GROUP BY 사용     
    SELECT
    	RC.CONTENT_TYPE, 
    	AT.ACT_DATE, 
    	AT.START_TIME, 
    	AT.END_TIME, 
    	COUNT(RC.CONTENT_TYPE) AS CNT /* COUNT 추가 */
    FROM
    		ACT_TIME AT
    	INNER JOIN REPORT_CONTENT RC ON
    		RC.content_idx = AT.content_idx
    	WHERE
    		AT.user_code = ???
    		AND AT.report_idx = ???
    	GROUP BY RC.CONTENT_TYPE  /* GROUP BY 추가 */

    3. SELCT문에서 조회결과와 여러 개의 COUNT() 값을 함께 조회할 경우

    1. OVER() 사용

    OVER() 함수는 보통 다른 윈도우 함수들과 함께 쓰이지만 OVER() 만을 사용할 수도 있다.

    OVER() 함수는 모든 행에 대해 계산된 집계 값을 반환하는 것을 의미한다.

    이것을 활용하여 SELCT 조회결과에 COUNT() 값을 붙여 조회했다.

    SELECT
    		RC.CONTENT_TYPE, /* 보고서 타입 (A, B 타입존재) */
    		AT.ACT_DATE, /* 활동일 */
    		AT.START_TIME, /* 활동시간 */
    		AT.END_TIME, /* 종료시간 */
    		COUNT(CASE WHEN RC.CONTENT_TYPE = 'A' THEN 1 END) OVER() AS Acnt,
    		COUNT(CASE WHEN RC.CONTENT_TYPE = 'B' THEN 1 END) OVER() AS Bcnt
    FROM
    		ACT_TIME AT
    	INNER JOIN REPORT_CONTENT RC ON
    		RC.content_idx = AT.content_idx
    	WHERE
    		AT.user_code = ???
    		AND AT.report_idx = ???

    https://java119.tistory.com/36

     

    [Mysql || MariaDB] Select 문 한번에 여러 개 Count()카운트 조회

    사용 이유 Select 문으로 다양한 Count 개수를 뽑아 낼 때 문법 및 예시 select count(CASE WHEN column=조건 THEN 1 END) as 별명(생략가능), count(CASE WHEN column=조건 THEN 1 END) as 별명(생략가능) from 테이블명; 먼저

    java119.tistory.com

     

    잘못된 내용이 있다면 지적부탁드립니다. 방문해주셔서 감사합니다.

     

     

     

    반응형

    'DB > MYSQL와 MariaDB' 카테고리의 다른 글

    [MariaDB]MariaDB에서 오라클 DB 연동  (0) 2024.08.12
    [MariaDB] 이클립스 MariaDB와 연동하기  (0) 2024.08.06
    [MYSQL] 윈도우 함수 정리  (0) 2024.07.08
    MariaDB 대소구분 해결  (0) 2024.03.21
    [MYSQL] 쿼리 속도개선  (1) 2023.12.10