SQL에서 COUNT 및 CASE 구문을 사용하여 데이터 개수 세기

SQL COUNT 함수와 CASE 구문을 결합하면 특정 조건에 따라 데이터를 효율적으로 세울 수 있습니다. 이를 통해 단순한 집계보다 유연한 집계가 가능합니다. 이 기사에서는 COUNT 함수와 CASE 구문의 기본을 이해하고, 구체적인 SQL 쿼리 예제를 통해 이를 사용하는 방법을 배웁니다.

목차

COUNT 함수의 기본

COUNT 함수는 SQL에서 데이터베이스의 행 수를 세는 데 사용됩니다. 전체 행 수를 얻거나 특정 열에 값이 있는 행 수를 얻는 데 사용할 수 있습니다.

모든 행 세기

테이블의 모든 행을 세기 위해서는 다음과 같이 COUNT(*)를 사용합니다:

SELECT COUNT(*) FROM table_name;

특정 열의 값 세기

특정 열에 값이 있는 행을 세기 위해서는 COUNT(column_name)를 사용합니다. NULL 값은 포함되지 않습니다.

SELECT COUNT(column_name) FROM table_name;

CASE 구문의 기본

CASE 구문은 SQL에서 지정된 조건에 따라 다른 값을 반환하는 조건식입니다. IF-THEN-ELSE 구문과 유사한 문법을 가지고 있으며, 특정 조건이 충족될 때 특정 값을 반환하고, 그렇지 않은 경우 다른 값을 반환합니다.

CASE 구문 문법

CASE 구문의 기본 문법은 다음과 같습니다:

CASE
    WHEN condition1 THEN result1
    WHEN condition2 THEN result2
    ...
    ELSE resultN
END

각 조건은 순서대로 평가되며, 첫 번째로 참인 조건의 결과가 반환됩니다. 모든 조건이 거짓인 경우 ELSE 부분의 결과가 반환됩니다. ELSE가 생략되면 모든 조건이 거짓일 때 NULL이 반환됩니다.

간단한 예제

예를 들어, 직원의 급여를 평가하고 특정 범위에 따라 등급을 지정하려면 다음과 같이 CASE 구문을 사용할 수 있습니다:

SELECT name,
       CASE
           WHEN salary >= 100000 THEN 'High'
           WHEN salary >= 50000 THEN 'Medium'
           ELSE 'Low'
       END AS salary_rating
FROM employees;

이 예제에서는 급여가 100000 이상이면 “High”를 반환하고, 50000 이상이면 “Medium”을 반환하며, 그 외에는 “Low”를 반환합니다.

COUNT와 CASE 구문 결합

COUNT 함수와 CASE 구문을 결합하면 특정 조건에 따라 데이터를 셀 수 있습니다. 이를 통해 여러 조건을 한 쿼리에서 평가하고 집계할 수 있습니다.

조건부 집계를 위한 기본 문법

COUNT 함수와 CASE 구문을 결합한 기본 문법은 다음과 같습니다:

SELECT
    COUNT(CASE WHEN condition1 THEN 1 END) AS count_condition1,
    COUNT(CASE WHEN condition2 THEN 1 END) AS count_condition2
FROM table_name;

이 문법은 각 조건을 충족하는 행의 수를 셉니다. CASE 구문이 참일 때 1을 반환하고, COUNT 함수는 이러한 발생 횟수를 셉니다.

구체적인 예제

예를 들어, 고객 테이블에서 남성과 여성 고객의 수를 세기 위해 다음 쿼리를 사용할 수 있습니다:

SELECT
    COUNT(CASE WHEN gender = 'Male' THEN 1 END) AS male_count,
    COUNT(CASE WHEN gender = 'Female' THEN 1 END) AS female_count
FROM customers;

이 예제는 성별이 ‘Male’인 행과 ‘Female’인 행의 수를 셉니다.

여러 조건 세기

여러 조건을 결합하여 데이터를 더 자세히 셀 수 있습니다. 예를 들어, 제품 상태가 ‘On Sale’ 및 ‘Discontinued’인 제품의 수를 세기 위해 다음 쿼리를 사용할 수 있습니다:

SELECT
    COUNT(CASE WHEN status = 'On Sale' THEN 1 END) AS on_sale_count,
    COUNT(CASE WHEN status = 'Discontinued' THEN 1 END) AS discontinued_count
FROM products;

이 방법을 통해 특정 조건에 따라 데이터를 쉽게 집계할 수 있습니다.

SQL 쿼리 예제

여기서는 COUNT 함수와 CASE 구문을 결합하여 특정 조건에 따라 데이터를 세는 구체적인 SQL 쿼리 예제를 소개합니다. 이를 통해 실제 데이터베이스 작업에서 이를 사용하는 방법을 이해할 수 있습니다.

예제 1: 연령대별 고객 수 세기

이 쿼리는 고객 테이블에서 다양한 연령대의 고객 수를 셉니다.

SELECT
    COUNT(CASE WHEN age < 20 THEN 1 END) AS 'Under 20',
    COUNT(CASE WHEN age BETWEEN 20 AND 29 THEN 1 END) AS '20s',
    COUNT(CASE WHEN age BETWEEN 30 AND 39 THEN 1 END) AS '30s',
    COUNT(CASE WHEN age BETWEEN 40 AND 49 THEN 1 END) AS '40s',
    COUNT(CASE WHEN age >= 50 THEN 1 END) AS '50 and above'
FROM customers;

이 쿼리는 고객을 다섯 가지 연령대로 분류하고 각 그룹의 수를 셉니다.

예제 2: 상태별 제품 수 세기

이 쿼리는 제품 테이블에서 상태별 제품 수를 셉니다.

SELECT
    COUNT(CASE WHEN status = 'In Stock' THEN 1 END) AS 'In Stock',
    COUNT(CASE WHEN status = 'Out of Stock' THEN 1 END) AS 'Out of Stock',
    COUNT(CASE WHEN status = 'Discontinued' THEN 1 END) AS 'Discontinued'
FROM products;

이 쿼리는 상태가 ‘In Stock’, ‘Out of Stock’, ‘Discontinued’인 제품의 수를 셉니다.

예제 3: 상태별 주문 수 세기

이 쿼리는 주문 테이블에서 상태별 주문 수를 셉니다.

SELECT
    COUNT(CASE WHEN status = 'New' THEN 1 END) AS 'New Orders',
    COUNT(CASE WHEN status = 'Processing' THEN 1 END) AS 'Processing Orders',
    COUNT(CASE WHEN status = 'Completed' THEN 1 END) AS 'Completed Orders'
FROM orders;

이 쿼리는 상태가 ‘New’, ‘Processing’, ‘Completed’인 주문의 수를 셉니다.

고급 예제

COUNT 함수와 CASE 구문의 조합은 더 복잡한 조건에도 적용할 수 있습니다. 여기에서는 실제 시나리오에서 유용한 몇 가지 실용적인 예제를 소개합니다.

예제 1: 구매 이력에 따른 고객 수 세기

이 쿼리는 고객 테이블과 구매 이력 테이블을 사용하여 지난 1년 동안 구매한 고객의 수를 셉니다.

SELECT
    COUNT(CASE WHEN purchase_date >= DATEADD(YEAR, -1, GETDATE()) THEN 1 END) AS 'Customers Purchased in Last Year',
    COUNT(CASE WHEN purchase_date < DATEADD(YEAR, -1, GETDATE()) OR purchase_date IS NULL THEN 1 END) AS 'Customers Not Purchased in Last Year'
FROM customers LEFT JOIN purchase_history ON customers.customer_id = purchase_history.customer_id;

이 쿼리는 지난 1년 동안 구매한 고객과 그렇지 않은 고객을 셉니다.

예제 2: 제품 카테고리별 판매 수 세기

이 쿼리는 판매 테이블과 제품 테이블을 조인하여 제품 카테고리별 판매 수를 셉니다.

SELECT
    product_category,
    COUNT(CASE WHEN sales_amount > 0 THEN 1 END) AS 'Sales Count'
FROM sales
JOIN products ON sales.product_id = products.product_id
GROUP BY product_category;

이 쿼리는 각 제품 카테고리에서 판매된 제품의 수를 셉니다.

예제 3: 여러 조건 결합하여 세기

이 쿼리는 여러 조건을 결합하여 데이터를 셉니다. 예를 들어, 연령대별 고객의 구매 상태를 세는 것입니다.

SELECT
    COUNT(CASE WHEN age < 20 AND purchase_date IS NOT NULL THEN 1 END) AS 'Customers Under 20 Who Purchased',
    COUNT(CASE WHEN age BETWEEN 20 AND 29 AND purchase_date IS NOT NULL THEN 1 END) AS 'Customers in 20s Who Purchased',
    COUNT(CASE WHEN age BETWEEN 30 AND 39 AND purchase_date IS NOT NULL THEN 1 END) AS 'Customers in 30s Who Purchased',
    COUNT(CASE WHEN age BETWEEN 40 AND 49 AND purchase_date IS NOT NULL THEN 1 END) AS 'Customers in 40s Who Purchased',
    COUNT(CASE WHEN age >= 50 AND purchase_date IS NOT NULL THEN 1 END) AS 'Customers 50 and Above Who Purchased'
FROM customers LEFT JOIN purchase_history ON customers.customer_id = purchase_history.customer_id;

이 쿼리는 연령대별로 구매 이력이 있는 고객의 수를 셉니다.

결론

COUNT 함수와 CASE 구문을 결합하면 SQL에서 특정 조건에 따라 데이터를 효율적으로 셀 수 있습니다. 이 방법은 단순한 집계뿐만 아니라 여러 조건을 한 번에 평가하고 분석하는 데 유용합니다. 구체적인 쿼리 예제를 통해 연령대별 고객 수 세기나 제품 상태별 집계와 같은 실제 데이터베이스 작업에서 이를 적용하는 방법을 배웠습니다. 이러한 기술을 활용하면 더 고급 데이터 분석 및 보고서 작성을 할 수 있습니다.

목차