web developer

[sql] 각 컬럼의 데이터를 합산한 쿼리 본문

SQL/Oracle SQL

[sql] 각 컬럼의 데이터를 합산한 쿼리

trueman 2024. 6. 20. 14:36
728x90
728x90

해당 테이블의 각 컬럼의 count 값 가져오는 쿼리는 다음과 같습니다.


(1) 서브쿼리를 사용한 카운트 합산

SELECT
    (SELECT COUNT(*) FROM validity WHERE mon01_usgqty LIKE '1@%') +
    (SELECT COUNT(*) FROM validity WHERE mon02_usgqty LIKE '1@%') AS total_count
FROM dual;

이 쿼리는 다음과 같이 작동합니다:

  1. validity 테이블에서 mon01_usgqty 컬럼이 '1@%'로 시작하는 값을 카운트합니다.
  2. validity 테이블에서 mon02_usgqty 컬럼이 '1@%'로 시작하는 값을 카운트합니다.
  3. 두 개의 서브쿼리 결과를 더하여 total_count라는 별칭으로 반환합니다.

(2) 공통 테이블 표현식(CTE, Common Table Expression)와 UNPIVOT을 사용해 데이터를 변환한 후 특정 패턴의 값을 카운트하는 쿼리

WITH filtered_validity AS (
    SELECT *
    FROM validity
    WHERE <조건>
),
unpivoted_table AS (
    SELECT usgqty
    FROM filtered_validity
    UNPIVOT (usgqty FOR mon IN (
        mon01_usgqty, mon02_usgqty, mon03_usgqty, mon04_usgqty, mon05_usgqty, 
        mon06_usgqty, mon07_usgqty, mon08_usgqty, mon09_usgqty, mon10_usgqty, 
        mon11_usgqty, mon12_usgqty
    ))
)
SELECT COUNT(*)
FROM unpivoted_table
WHERE usgqty LIKE '1@%';

이 쿼리는 다음과 같은 단계를 거칩니다:

  1. filtered_validity CTE: validity 테이블에서 원하는 조건(<조건>)을 만족하는 행을 선택합니다.
  2. unpivoted_table CTE: filtered_validity 결과에서 UNPIVOT 연산을 사용하여 mon01_usgqty부터 mon12_usgqty까지의 열을 usgqty라는 단일 열로 변환합니다.
  3. 메인 쿼리: unpivoted_table에서 usgqty가 '1@%'로 시작하는 값을 카운트합니다.

 

728x90
728x90