조건부 집계는 보고서 작성에서 전형적인 문제입니다. 처음에는 다양한 지표를 계산하기 위해 필터가 있는 개별 쿼리가 작성되었습니다. 곧 CASE를 집계 함수 내에서 사용하는 보다 간결한 해결책인 조건부 집계가 나타났습니다(예: SUM(CASE WHEN ...)). 필터, 그룹화 및 총계 머리글을 혼합할 때 문제가 발생할 수 있습니다: 잘못된 합계를 얻거나 결과를 잘못 해석할 수 있습니다.
해결 방법: 집계 함수 내에서 조건부 집계를 사용하세요. 예를 들어, 모든 직원에 대해 "처리 중" 및 "완료"된 주문 수를 출력하려면:
SELECT employee_id, SUM(CASE WHEN status = 'processing' THEN 1 ELSE 0 END) as processing_count, SUM(CASE WHEN status = 'done' THEN 1 ELSE 0 END) as done_count FROM Orders GROUP BY employee_id;
주요 특징:
CASE 조건이 NULL을 반환하면 무엇이 발생하나요?
집계 함수 SUM은 NULL을 무시합니다. 따라서 CASE WHEN ... THEN 1 END를 작성하면 누락된 행이 고려되지 않습니다. 항상 ELSE 0을 명시적으로 설정하는 것이 좋습니다.
SUM(CASE WHEN status = 'processing' THEN 1 ELSE 0 END)
WHERE 필터가 조건부 집계를 통한 상태의 최종 합계를 변경할 수 있나요?
네: 기본 WHERE가 선택을 제한하면(예: WHERE region = 'west'), 계산은 필터링된 데이터에 대해서만 이루어집니다. 전역 합계를 원하시면 서브쿼리를 사용하거나 필터를 제거하세요.
HAVING을 사용하여 그룹화 전 행을 필터링할 수 있나요?
아니요. HAVING은 이미 그룹화된 데이터를 집계 기준으로 필터링합니다. 원본 행의 필터링은 WHERE를 통해 이루어집니다.
분석 보고서에서 다음을 사용했습니다:
SUM(CASE WHEN status = 'approved' THEN 1 END)
NULL이 많아 결과 합계가 낮게 나왔습니다. WHERE 필터로 인해 필요한 행이 일부 누락되었습니다.
장점:
단점:
다음과 같이 사용했습니다:
SUM(CASE WHEN status = 'approved' THEN 1 ELSE 0 END)
코드를 하나의 쿼리에서 유지하고, 최종 결과에 대한 필터는 HAVING을 통해 진행했습니다.
장점:
단점: