프로그래밍백엔드 개발자, BI 분석가

SQL에서 여러 필터를 사용하여 보고서를 작성할 때 조건부 집계(conditional aggregation)를 신뢰성 있게 구현하는 방법은 무엇인가요? HAVING, CASE 및 집계 함수 혼합 시 주의해야 할 점은 무엇인가요?

Hintsage AI 어시스턴트로 면접 통과

답변.

조건부 집계는 보고서 작성에서 전형적인 문제입니다. 처음에는 다양한 지표를 계산하기 위해 필터가 있는 개별 쿼리가 작성되었습니다. 곧 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;

주요 특징:

  • WHERE 필터와 관계없이 모든 필요한 합계가 하나의 쿼리에서 계산됩니다.
  • SUM 내부의 CASE는 복잡한 다중 지표 보고서를 구축할 수 있게 합니다.
  • HAVING은 이미 집계된 데이터에 적용되어 결과 그룹화 후 필터링합니다.

함정 질문들.

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를 통해 이루어집니다.

일반적인 오류 및 안티 패턴

  • ELSE가 없어서 CASE가 NULL을 반환하고, 결과가 잘못됩니다.
  • WHERE와 HAVING을 혼합하여 잘못된 행을 얻습니다.
  • 여러 개의 쿼리를 사용하는 대신 CASE가 포함된 단일 쿼리를 사용합니다.

실생활 사례

부정적 사례

분석 보고서에서 다음을 사용했습니다:

SUM(CASE WHEN status = 'approved' THEN 1 END)

NULL이 많아 결과 합계가 낮게 나왔습니다. WHERE 필터로 인해 필요한 행이 일부 누락되었습니다.

장점:

  • 코드가 짧습니다.

단점:

  • 결과가 정확하지 않으며, 비즈니스에 잘못된 설명을 하였습니다.

긍정적 사례

다음과 같이 사용했습니다:

SUM(CASE WHEN status = 'approved' THEN 1 ELSE 0 END)

코드를 하나의 쿼리에서 유지하고, 최종 결과에 대한 필터는 HAVING을 통해 진행했습니다.

장점:

  • 정확하고 투명한 지표입니다.
  • 새로운 상태를 쉽게 추가할 수 있습니다.

단점:

  • 쿼리가 길어지며, 필터링에 주의가 필요합니다.