프로그래밍백엔드 개발자

SQL에서 조건부 집계를 어떻게 구현할 수 있습니까(예: 동일한 선택 항목의 상태별 합계를 계산) 및 여기에서 존재하는 함정은 무엇입니까?

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

답변.

조건부 집계는 하나의 쿼리 내에서 다양한 조건에 따라 값을 집계(예: 합계 또는 수)해야 할 때 사용됩니다. 역사적으로, 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;

주요 특징:

  • 여러 조건을 동시에 하나의 쿼리에서 집계할 수 있습니다.
  • 모든 SQL 방언에서 작동합니다(정확한 구문 지원은 다를 수 있음).
  • SUM뿐만 아니라 COUNT, AVG 등과 함께 사용할 수 있습니다.

속임수 질문.

조건부 집계를 위해 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를 사용하세요.

전형적인 오류 및 안티 패턴

  • WHERE를 사용하여 CASE 내의 중첩된 논리 대신 사용하면 여러 개별 쿼리를 실행해야 하므로 성능이 저하됩니다.
  • CASE에 ELSE 0을 지정하지 않으면 NULL로 인해 부정확한 수량/합계를 얻을 수 있습니다.
  • 필요한 검증 없이 CASE를 복사 붙여넣기 하면 논리 오류와 잘못된 계산이 발생할 수 있습니다.

실제 사례

부정적 사례

분석가는 각 상태별로 합계를 계산하려고 하여 여러 개의 개별 서브쿼리를 작성했습니다. 외부 보고서는 복잡해졌고, 새로운 상태 추가는 매번 코드를 재작성해야 했습니다.

장점:

  • 단일 메트릭에 대해 쉽게 구현할 수 있습니다. 단점:
  • 확장하기 어렵고, 낮은 성능 및 코드의 반복성이 있습니다.

긍정적 사례

개발자는 하나의 일반 쿼리에서 CASE를 사용하여 새로운 상태를 추가할 수 있는 유연한 보고서를 작성했습니다.

장점:

  • 높은 가독성, 확장 용이성, 성능. 단점:
  • 다양한 DBMS에서 CASE 구문 및 그 세부 사항에 대한 지식이 필요합니다.