n8n SQL 심화 이해하기: 고급 쿼리와 트랜잭션
목차
"고객별 총 매출"을 알고 싶습니다. SELECT만으로 될까요?
JOIN으로 테이블을 합치고, GROUP BY로 고객별로 묶고, SUM()으로 합계를 구합니다.
이 글을 다 읽으면 월별 매출, 고객별 구매금액, 재구매율을 쿼리 한 줄로 뽑을 수 있습니다.
① n8n SQL JOIN — 테이블 합치기
🎭 왜왜씨와 딱딱씨의 대화
🤔
왜왜씨
JOIN이 뭔가요?
🎯
딱딱씨
두 테이블을 합치는 것이야! 예를 들어 "고객 테이블"과 "주문 테이블"을 연결해서 "어떤 고객이 뭘 주문했는지" 한 번에 볼 수 있지.
JOIN 종류
| 종류 | 설명 | 결과 |
|---|---|---|
| INNER JOIN | 양쪽 모두에 있는 것만 | 교집합 |
| LEFT JOIN | 왼쪽 테이블 전체 + 오른쪽 매칭 | 왼쪽 기준 |
| RIGHT JOIN | 오른쪽 테이블 전체 + 왼쪽 매칭 | 오른쪽 기준 |
JOIN 예시
-- 고객 정보와 주문 정보 연결
SELECT
customers.name,
customers.email,
orders.order_date,
orders.total_amount
FROM customers
INNER JOIN orders ON customers.id = orders.customer_id;
-- 주문이 없는 고객도 포함
SELECT
customers.name,
orders.order_date
FROM customers
LEFT JOIN orders ON customers.id = orders.customer_id;
② n8n SQL 집계 함수 — COUNT, SUM, AVG
여러 행의 데이터를 하나의 값으로 계산합니다.
주요 집계 함수
| 함수 | 설명 | 예시 |
|---|---|---|
COUNT(*) |
행 개수 | 총 주문 건수 |
SUM(column) |
합계 | 총 매출액 |
AVG(column) |
평균 | 평균 주문금액 |
MAX(column) |
최대값 | 최고 금액 주문 |
MIN(column) |
최소값 | 최저 금액 주문 |
-- 전체 주문 건수 SELECT COUNT(*) as total_orders FROM orders; -- 총 매출액 SELECT SUM(total_amount) as total_sales FROM orders; -- 평균 주문 금액 SELECT AVG(total_amount) as avg_order FROM orders;
③ n8n SQL GROUP BY — 고객별, 월별 집계
특정 기준으로 그룹화하여 집계합니다.
GROUP BY 예시
-- 카테고리별 상품 개수
SELECT category, COUNT(*) as product_count
FROM products
GROUP BY category;
-- 월별 매출 집계
SELECT
DATE_FORMAT(order_date, '%Y-%m') as month,
SUM(total_amount) as monthly_sales
FROM orders
GROUP BY DATE_FORMAT(order_date, '%Y-%m');
-- 고객별 총 주문금액 (상위 10명)
SELECT
customer_id,
SUM(total_amount) as total_spent
FROM orders
GROUP BY customer_id
ORDER BY total_spent DESC
LIMIT 10;
HAVING: 그룹 필터링
-- 100만원 이상 구매한 고객만
SELECT
customer_id,
SUM(total_amount) as total_spent
FROM orders
GROUP BY customer_id
HAVING SUM(total_amount) >= 1000000;
WHERE는 그룹화 전 필터링, HAVING은 그룹화 후 필터링!
④ n8n SQL 서브쿼리 — 쿼리 안에 쿼리
쿼리 안에 또 다른 쿼리를 넣는 것입니다.
서브쿼리 예시
-- 평균보다 높은 금액의 주문
SELECT * FROM orders
WHERE total_amount > (SELECT AVG(total_amount) FROM orders);
-- 최근 주문한 고객 정보
SELECT * FROM customers
WHERE id IN (
SELECT DISTINCT customer_id
FROM orders
WHERE order_date > '2026-01-01'
);
-- 각 카테고리의 최고가 상품
SELECT * FROM products p1
WHERE price = (
SELECT MAX(price)
FROM products p2
WHERE p1.category = p2.category
);
⑤ n8n SQL 실전 쿼리 — 복사해서 바로 쓰기
💡 예제 1: 오늘 주문 요약 리포트
SELECT
COUNT(*) as order_count,
SUM(total_amount) as total_sales,
AVG(total_amount) as avg_order
FROM orders
WHERE DATE(order_date) = '{{ $now.toFormat("yyyy-MM-dd") }}';
💡 예제 2: 고객별 최근 주문 조회
SELECT
c.name,
c.email,
o.order_date,
o.total_amount
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id
WHERE o.order_date > '{{ $now.minus({days: 30}).toFormat("yyyy-MM-dd") }}'
ORDER BY o.order_date DESC;
💡 예제 3: 재구매율 높은 고객
SELECT
customer_id,
COUNT(*) as order_count,
SUM(total_amount) as total_spent
FROM orders
GROUP BY customer_id
HAVING COUNT(*) >= 3
ORDER BY total_spent DESC;
🎯
딱딱씨의 팁
복잡한 쿼리는 먼저 DB 툴에서 테스트한 후 n8n에 적용하세요!
핵심 정리
JOIN - 테이블 연결
집계 함수 - COUNT, SUM, AVG
GROUP BY - 그룹별 집계
서브쿼리 - 쿼리 중첩
3초 선택 가이드
두 테이블 합치기? → JOIN ... ON
총합/평균/개수? → SUM/AVG/COUNT
고객별, 월별 집계? → GROUP BY
집계 결과 필터링? → HAVING (WHERE 아님!)
다음 글 예고
👉 n8n 에러 핸들링 노드 : 안정적인 워크플로우 만들기
SQL 심화를 익히면 데이터 분석 자동화가 가능합니다.
복잡한 리포트도 SQL 한 줄로!
댓글
댓글 쓰기