SQL의 집계 함수를 사용하여 월별, 연도별 데이터 분석을 수행하는 방법

SQL의 집계 함수는 데이터를 집계하고 분석하기 위한 강력한 도구입니다. 이 기사에서는 월별 및 연도별로 데이터를 분석하는 방법에 초점을 맞추어, 집계 함수의 기본 개념부터 실제 쿼리의 구체적인 예까지 자세히 설명합니다. SQL을 사용하여 효율적으로 데이터를 집계하고 비즈니스 인사이트를 얻는 방법을 배워보세요.

목차

집계 함수의 기본

집계 함수는 데이터베이스의 여러 행에서 단일 결과를 얻기 위한 함수입니다. 대표적인 집계 함수로는 다음과 같은 것들이 있습니다.

SUM

숫자 데이터의 합계를 계산합니다.

AVG

숫자 데이터의 평균값을 계산합니다.

COUNT

행의 수를 계산합니다.

MAX

지정된 열의 최대값을 반환합니다.

MIN

지정된 열의 최소값을 반환합니다.

이 함수들은 GROUP BY 구문과 함께 사용되어 특정 그룹별로 집계를 수행할 수 있습니다. 다음으로, 월별 및 연도별 데이터 분석의 구체적인 방법을 살펴보겠습니다.

월별 데이터 분석의 기초

월별 데이터 분석에서는 데이터를 월 단위로 집계하여 분석합니다. SQL에서는 DATE 형식의 열을 사용하여 월별로 데이터를 그룹화하고 집계 함수를 적용합니다.

SQL 쿼리의 기본 구조

월별 데이터를 집계하기 위한 기본적인 SQL 쿼리는 다음과 같습니다:

SELECT 
    DATE_FORMAT(order_date, '%Y-%m') AS month,
    SUM(sales) AS monthly_sales
FROM 
    orders
GROUP BY 
    DATE_FORMAT(order_date, '%Y-%m');

이 쿼리에서는 DATE_FORMAT 함수를 사용하여 order_date 열의 날짜를 ‘연도-월’ 형식으로 변환하고, 각 월별로 매출을 집계하고 있습니다.

연도별 데이터 분석의 기초

연도별 데이터 분석에서는 데이터를 연 단위로 집계하여 분석합니다. SQL에서는 DATE 형식의 열을 사용하여 연도별로 데이터를 그룹화하고 집계 함수를 적용합니다.

SQL 쿼리의 기본 구조

연도별 데이터를 집계하기 위한 기본적인 SQL 쿼리는 다음과 같습니다:

SELECT 
    YEAR(order_date) AS year,
    SUM(sales) AS yearly_sales
FROM 
    orders
GROUP BY 
    YEAR(order_date);

이 쿼리에서는 YEAR 함수를 사용하여 order_date 열의 날짜에서 연도를 추출하고, 각 연도별로 매출을 집계하고 있습니다.

SQL 쿼리의 구체적인 예시 (매출 데이터)

매출 데이터를 사용하여 월별 및 연도별로 집계하는 구체적인 SQL 쿼리를 소개합니다.

월별 매출 데이터의 집계

월별로 매출을 집계하는 쿼리의 예시입니다:

SELECT 
    DATE_FORMAT(order_date, '%Y-%m') AS month,
    SUM(sales) AS monthly_sales
FROM 
    orders
GROUP BY 
    DATE_FORMAT(order_date, '%Y-%m')
ORDER BY 
    month;

이 쿼리에서는 DATE_FORMAT 함수를 사용하여 날짜를 ‘연도-월’ 형식으로 변환하고, 각 월의 매출 합계를 계산합니다. 결과는 월별로 정렬됩니다.

연도별 매출 데이터의 집계

연도별로 매출을 집계하는 쿼리의 예시입니다:

SELECT 
    YEAR(order_date) AS year,
    SUM(sales) AS yearly_sales
FROM 
    orders
GROUP BY 
    YEAR(order_date)
ORDER BY 
    year;

이 쿼리에서는 YEAR 함수를 사용하여 날짜에서 연도를 추출하고, 각 연도의 매출 합계를 계산합니다. 결과는 연도별로 정렬됩니다.

SQL 쿼리의 구체적인 예시 (사용자 데이터)

사용자 데이터를 사용하여 월별 및 연도별로 집계하는 구체적인 SQL 쿼리를 소개합니다.

월별 사용자 등록 수의 집계

월별로 사용자의 등록 수를 집계하는 쿼리의 예시입니다:

SELECT 
    DATE_FORMAT(registration_date, '%Y-%m') AS month,
    COUNT(*) AS monthly_registrations
FROM 
    users
GROUP BY 
    DATE_FORMAT(registration_date, '%Y-%m')
ORDER BY 
    month;

이 쿼리에서는 DATE_FORMAT 함수를 사용하여 날짜를 ‘연도-월’ 형식으로 변환하고, 각 월의 사용자 등록 수를 계산합니다. 결과는 월별로 정렬됩니다.

연도별 사용자 등록 수의 집계

연도별로 사용자의 등록 수를 집계하는 쿼리의 예시입니다:

SELECT 
    YEAR(registration_date) AS year,
    COUNT(*) AS yearly_registrations
FROM 
    users
GROUP BY 
    YEAR(registration_date)
ORDER BY 
    year;

이 쿼리에서는 YEAR 함수를 사용하여 날짜에서 연도를 추출하고, 각 연도의 사용자 등록 수를 계산합니다. 결과는 연도별로 정렬됩니다.

그룹화 및 필터링의 응용

GROUP BYHAVING 구문을 사용하여 더 상세한 데이터 분석을 수행하는 방법을 설명합니다.

GROUP BY의 응용

GROUP BY 구문은 여러 열을 사용하여 데이터를 그룹화할 수 있습니다. 예를 들어, 월별 및 상품 카테고리별로 매출을 집계하려면 다음과 같은 쿼리를 사용합니다:

SELECT 
    DATE_FORMAT(order_date, '%Y-%m') AS month,
    product_category,
    SUM(sales) AS monthly_sales
FROM 
    orders
GROUP BY 
    DATE_FORMAT(order_date, '%Y-%m'),
    product_category
ORDER BY 
    month,
    product_category;

이 쿼리에서는 주문일을 월 단위로 그룹화하고, 추가로 상품 카테고리별로 매출을 집계하고 있습니다.

HAVING 구문을 통한 필터링

HAVING 구문은 GROUP BY 구문으로 그룹화된 결과에 조건을 지정하기 위해 사용됩니다. 예를 들어, 월간 매출이 일정 금액 이상인 월을 필터링하려면 다음과 같은 쿼리를 사용합니다:

SELECT 
    DATE_FORMAT(order_date, '%Y-%m') AS month,
    SUM(sales) AS monthly_sales
FROM 
    orders
GROUP BY 
    DATE_FORMAT(order_date, '%Y-%m')
HAVING 
    monthly_sales > 100000
ORDER BY 
    month;

이 쿼리에서는 월별 매출이 100,000엔을 초과하는 월만 결과에 포함됩니다.

응용 예시: 특정 상품 카테고리의 연도별 매출

특정 상품 카테고리의 연도별 매출을 집계하고, 추가로 연간 매출이 50,000엔을 초과하는 연도만 표시하는 쿼리의 예시입니다:

SELECT 
    YEAR(order_date) AS year,
    product_category,
    SUM(sales) AS yearly_sales
FROM 
    orders
WHERE 
    product_category = 'specific_category'
GROUP BY 
    YEAR(order_date),
    product_category
HAVING 
    yearly_sales > 50000
ORDER BY 
    year;

이 쿼리에서는 상품 카테고리가 ‘specific_category’인 주문을 연도별로 그룹화하고, 연간 매출이 50,000엔을 초과하는 연도를 필터링하여 표시합니다.

성능 최적화

집계 쿼리의 성능을 향상시키기 위한 기술 및 모범 사례에 대해 설명합니다.

인덱스 사용

인덱스를 사용하면 쿼리 실행 속도를 크게 향상시킬 수 있습니다. 특히 집계 함수에 사용되는 열이나 GROUP BY 또는 WHERE 구문에서 자주 사용되는 열에 인덱스를 설정하면 효과적입니다.

CREATE INDEX idx_order_date ON orders(order_date);

이 쿼리에서는 order_date 열에 인덱스를 생성하고 있습니다. 이를 통해 주문일에 따른 검색이나 집계가 고속화됩니다.

쿼리 작성 방식 최적화

쿼리 구조를 개선함으로써 성능을 향상시킬 수 있습니다. 예를 들어, 서브쿼리 사용을 피하고, 필요한 열만 선택하는 것이 유효합니다.

비효율적인 쿼리의 예

SELECT 
    YEAR(order_date) AS year,
    (SELECT SUM(sales) FROM orders WHERE YEAR(order_date) = year) AS yearly_sales
FROM 
    orders
GROUP BY 
    YEAR(order_date);

이 쿼리는 비효율적입니다. 서브쿼리를 사용하지 않고 직접 집계하는 것이 더 빠릅니다.

효율적인 쿼리의 예

SELECT 
    YEAR(order_date) AS year,
    SUM(sales) AS yearly_sales
FROM 
    orders
GROUP BY 
    YEAR(order_date);

이 쿼리는 직접 집계하고 있어, 더 빠르게 실행됩니다.

데이터 정규화 및 비정규화

데이터베이스 설계 단계에서 적절한 정규화를 수행하는 것이 중요합니다. 그러나 읽기 전용 분석 쿼리에서는 비정규화를 통해 성능이 향상될 수 있습니다. 비정규화는 데이터의 중복성을 허용하고, 데이터를 결합하는 수고를 줄이는 방법입니다.

파티셔닝 활용

대규모 테이블에 대해서는 파티셔닝을 사용하여 성능을 개선할 수 있습니다. 파티셔닝은 테이블을 논리적으로 분할하여 특정 조건에 따라 데이터를 분산시키는 방법입니다.

CREATE TABLE orders (
    order_id INT,
    order_date DATE,
    sales DECIMAL(10, 2),
    product_category VARCHAR(50),
    ...
) PARTITION BY RANGE (YEAR(order_date)) (
    PARTITION p2020 VALUES LESS THAN (2021),
    PARTITION p2021 VALUES LESS THAN (2022),
    PARTITION p2022 VALUES LESS THAN (2023)
);

이 쿼리에서는 order_date를 기준으로 테이블을 연도별로 파티셔닝하고 있습니다. 이를 통해 특정 연도에 대한 쿼리 성능이 향상됩니다.

결론

월별 및 연도별 데이터 분석은 비즈니스의 중요한 인사이트를 얻기 위해 필수적입니다. SQL의 집계 함수를 사용하면 데이터를 간단하고 효율적으로 집계할 수 있습니다. 구체적인 쿼리 예제와 응용 기술을 활용하여 효과적인 데이터 분석을 실현하세요. 적절한 인덱스 사용과 쿼리 최적화를 통해 성능도 크게 향상시킬 수 있습니다. SQL을 활용하여 데이터 기반의 의사 결정을 지원하세요.

목차