회계 밖 세상

SQLite로 연도별 데이터 비교 및 조건 필터링 완벽 가이드 (ft. CSV 내보내기 실무 팁) 본문

IT이야기

SQLite로 연도별 데이터 비교 및 조건 필터링 완벽 가이드 (ft. CSV 내보내기 실무 팁)

지파지파 2025. 5. 23. 15:04
반응형

매년 업데이트되는 데이터를 비교 분석하는 일은 다양한 업무 분야에서 자주 발생합니다. 매출 데이터, 고객 정보, 재고 현황, 직원 정보 등 시간에 따라 변화하는 모든 데이터에 적용할 수 있는 방법입니다. 오늘은 SQLite와 DB Browser를 활용해 2023년 vs 2024년 데이터 비교를 실무 예제로 정리해보겠습니다.

1. 데이터 준비 및 테이블 구조 확인

먼저 비교할 두 테이블의 구조를 파악해야 합니다. DB Browser에서 다음 명령어로 테이블 정보를 확인할 수 있습니다.

PRAGMA table_info(data_2023);
PRAGMA table_info(data_2024);

이 명령어는 컬럼명, 자료형, NULL 허용 여부 등을 보여주어 두 테이블의 구조가 동일한지 확인할 수 있습니다.

실무 팁: 테이블 구조가 다르다면 비교 전에 컬럼을 통일하거나 별칭(alias)을 사용해 매칭시켜야 합니다.

2. 기본키 기준 데이터 조인하기

데이터 비교의 핵심은 **고유 식별자(기본키)**를 기준으로 두 테이블을 연결하는 것입니다. 여기서는 'id' 컬럼을 예시로 사용하겠습니다.

CREATE TABLE comparison_data AS 
SELECT 
    d24.id,
    d24.name AS name_2024,
    d23.name AS name_2023,
    d24.category AS category_2024,
    d23.category AS category_2023,
    d24.amount AS amount_2024,
    d23.amount AS amount_2023,
    d24.status AS status_2024,
    d23.status AS status_2023
FROM data_2024 d24
LEFT JOIN data_2023 d23 ON d24.id = d23.id;

조인 방식 선택 가이드:

  • LEFT JOIN: 2024년 기준 데이터 (신규 항목 포함)
  • INNER JOIN: 양쪽 연도에 모두 존재하는 데이터만
  • FULL OUTER JOIN: 모든 데이터 포함 (SQLite에서는 UNION으로 구현)

3. 다양한 조건으로 데이터 필터링

실무에서는 복합적인 조건으로 데이터를 추출해야 하는 경우가 많습니다. 다음은 8개 조건을 조합한 예제입니다:

SELECT * FROM comparison_data 
WHERE 
    category_2024 = '전자제품' 
    AND status_2024 = '활성'
    AND amount_2024 > 1000000
    AND name_2024 LIKE '%프리미엄%'
    AND category_2023 = '가전제품'
    AND status_2023 = '대기'
    AND amount_2023 BETWEEN 500000 AND 2000000
    AND name_2023 NOT LIKE '%구형%';

활용 사례:

  • 인사 관리: 부서 이동, 직급 변경 추적
  • 재고 분석: 카테고리 변경, 가격 인상/인하 항목
  • 고객 분석: 등급 변화, 구매 패턴 변화
  • 매출 분석: 제품군 재분류, 수익성 변화

4. 데이터 현황 파악하기

분석 전에 데이터의 전체적인 현황을 파악하는 것이 중요합니다.

-- 전체 데이터 건수
SELECT COUNT(*) as 총_데이터수 FROM comparison_data;

-- 매칭 현황 분석
SELECT 
    COUNT(*) as 전체건수,
    COUNT(name_2023) as 기존데이터_매칭수,
    COUNT(*) - COUNT(name_2023) as 신규데이터수,
    ROUND((COUNT(name_2023) * 100.0 / COUNT(*)), 2) as 매칭률
FROM comparison_data;

-- 컬럼 정보 확인
PRAGMA table_info(comparison_data);

5. 변화 분석 쿼리 예제

값 변경 추적

-- 이름이 변경된 항목
SELECT id, name_2023, name_2024 
FROM comparison_data 
WHERE name_2023 != name_2024 
AND name_2023 IS NOT NULL;

-- 금액 변화 분석
SELECT 
    id, 
    name_2024,
    amount_2023,
    amount_2024,
    (amount_2024 - amount_2023) as 변화량,
    ROUND(((amount_2024 - amount_2023) * 100.0 / amount_2023), 2) as 변화율
FROM comparison_data 
WHERE amount_2023 IS NOT NULL 
AND amount_2024 != amount_2023;

카테고리 변경 분석

-- 카테고리가 변경된 항목별 집계
SELECT 
    category_2023 as 이전카테고리,
    category_2024 as 현재카테고리,
    COUNT(*) as 변경건수
FROM comparison_data 
WHERE category_2023 != category_2024 
AND category_2023 IS NOT NULL
GROUP BY category_2023, category_2024
ORDER BY 변경건수 DESC;

6. CSV 내보내기 실무 팁

SQLite에서 CSV로 데이터를 내보낼 때 주의해야 할 설정들입니다.

개행문자 설정 가이드

설정 의미 추천 상황
CR+LF \r\n (Windows 표준) Excel에서 열어볼 때
LF \n (Linux/Unix 표준) 서버 분석, 프로그래밍 활용
CR \r (구형 Mac) 거의 사용하지 않음

DB Browser에서 CSV 내보내기 설정

  1. File → Export → Table(s) as CSV
  2. 테이블 선택 후 옵션 설정:
    • 구분자: 콤마(,) 권장
    • 따옴표: 텍스트 필드 보호용
    • 개행문자: CR+LF (Windows 호환성)
    • 인코딩: UTF-8 (한글 깨짐 방지)

💡 Pro Tip: 대용량 데이터는 조건을 나누어 여러 번 내보내거나, LIMIT을 사용해 샘플 데이터부터 확인해보세요.

7. 데이터 품질 검증

분석 결과의 신뢰성을 위해 데이터 품질을 검증하는 쿼리들입니다.

-- 중복 ID 검사
SELECT id, COUNT(*) as 중복수 
FROM data_2024 
GROUP BY id 
HAVING COUNT(*) > 1;

-- NULL 값 현황
SELECT 
    'name' as 컬럼명,
    COUNT(*) - COUNT(name_2024) as NULL_2024,
    COUNT(*) - COUNT(name_2023) as NULL_2023
FROM comparison_data
UNION ALL
SELECT 
    'amount' as 컬럼명,
    COUNT(*) - COUNT(amount_2024) as NULL_2024,
    COUNT(*) - COUNT(amount_2023) as NULL_2023
FROM comparison_data;

-- 이상값 탐지 (예: 음수 금액)
SELECT COUNT(*) as 이상값_건수
FROM comparison_data 
WHERE amount_2024 < 0 OR amount_2023 < 0;
반응형