조건부 집계는 하나의 쿼리 내에서 다양한 조건에 따라 값을 집계(예: 합계 또는 수)해야 할 때 사용됩니다. 역사적으로, SQL 개발자들은 이러한 목표를 달성하기 위해 여러 서브쿼리를 작성하거나 각 카테고리별로 조인 및 그룹화를 따로 수행해야 했으며, 이는 읽기 어렵고 비효율적인 코드를 낳았습니다.
문제는 서로 다른 조건으로 여러 집계를 동시에 계산하는 것이 어려웠다는 것입니다. 각 개별 집계는 일반적으로 필터링이 필요하며, 단순히 SUM() 또는 COUNT()를 적용하는 것은 집계 함수 내에서 필요한 조건을 고려하지 않기 때문입니다.
해결책은 집계 함수 내에서 CASE 구문을 사용하는 것입니다. 이를 통해 여러 조건에 따라 집계를 "나누어" 실행할 수 있으며, 여러 조인 없이도 가능합니다:
코드 예:
SELECT department, SUM(CASE WHEN status = 'approved' THEN amount ELSE 0 END) AS approved_sum, SUM(CASE WHEN status = 'pending' THEN amount ELSE 0 END) AS pending_sum, COUNT(CASE WHEN status = 'rejected' THEN 1 END) AS rejected_count FROM payments GROUP BY department;
주요 특징:
조건부 집계를 위해 CASE 구문 없이 진행할 수 있습니까?
부정확한 답변은 쿼리에서 직접 WHERE를 사용하여 집계 함수와 함께 사용하는 것입니다. 사실 WHERE는 집계 전 행을 필터링하며, 각 집계 열 내에서 필터링하지 않습니다.
코드 예(잘못된 방법):
SELECT COUNT(*) FROM payments WHERE status = 'approved'; SELECT COUNT(*) FROM payments WHERE status = 'pending';
이 쿼리는 CASE 없이 서로 다른 조건에 따라 결과를 하나의 행으로 결합할 수 없습니다.
조건식 내에서 NULL을 사용하면 어떻게 됩니까?
CASE가 대체 값을 반환하지 않으면 기본적으로 NULL이 되며, 집계 함수는 NULL을 무시합니다.
코드 예:
SUM(CASE WHEN status = 'approved' THEN amount END) -- status가 'approved'가 아니면 NULL이 되어, SUM에서 행이 무시됨
CASE 대신 IF를 사용할 수 있습니까?
일부 SQL 방언(예: MySQL)에서는 가능하지만, 그러한 코드는 다양한 데이터베이스 간의 이식성이 떨어집니다. 범용 쿼리에서는 항상 CASE를 사용하세요.
분석가는 각 상태별로 합계를 계산하려고 하여 여러 개의 개별 서브쿼리를 작성했습니다. 외부 보고서는 복잡해졌고, 새로운 상태 추가는 매번 코드를 재작성해야 했습니다.
장점:
개발자는 하나의 일반 쿼리에서 CASE를 사용하여 새로운 상태를 추가할 수 있는 유연한 보고서를 작성했습니다.
장점: