Juan Davis

Art

마케터가 SQL로 매출 데이터를 다루는 법: WHERE, GROUP BY, ORDER BY 실전 노트

월요일 아침, 한 마케터가 주간 보고서를 작성하기 위해 엑셀 파일을 열었다. 수천 개의 거래 내역이 담긴 시트에서 지역별 매출 합계를 구하려고 피벗 테이블을 만들다가, 문득 이런 생각이 들었다. “이걸 매주 반복하지 않고, 몇 줄의 명령어로 바로 뽑아낼 수는 없을까?” 그 시점부터 SQL이라는 낯선 도구를 배우기 시작했다. 이 글은 그와 같은 고민을 가진 마케터를 위해, 매출 데이터를 직접 집계해보는 과정을 실전 문제 풀이 형식으로 담았다.

핵심은 단순하다. 데이터베이스에서 원하는 정보만 걸러내는 WHERE, 같은 기준으로 묶어 합계를 내는 GROUP BY, 그리고 결과의 순서를 정렬하는 ORDER BY. 이 세 가지 구문만 이해해도 상당수의 매출 보고서를 SQL로 대체할 수 있다. 복잡한 프로그래밍 이론은 필요 없다. 마치 엑셀에서 필터, SUMIF, 정렬 기능을 쓰는 원리와 크게 다르지 않기 때문이다.

우선 WHERE 절부터 살펴보자. 이 구문은 전체 데이터에서 특정 조건을 충족하는 행만 선택하는 역할을 한다. 예를 들어, 최근 한 달간의 온라인 채널 매출만 확인하고 싶다면, 날짜 필드와 채널 필드에 조건을 지정하면 된다. 마케터가 자주 사용하는 조건으로는 특정 기간, 특정 캠페인, 특정 상품 카테고리 등이 있다. 엑셀의 자동 필터 기능과 동일한 역할이라고 생각하면 이해가 빠르다. 단, SQL에서는 텍스트 값에 작은따옴표를 붙이고, 날짜는 표준 형식으로 입력하는 규칙을 기억해야 한다. 비교 연산자로는 같다(=), 같지 않다(!=), 크다(>), 작다(<), 그리고 특정 문자열을 포함하는 LIKE 문법이 자주 쓰인다.

다음으로 GROUP BY 절은 데이터를 논리적인 묶음으로 재구성하는 핵심 도구다. “지역별 총매출”, “월별 주문 건수”, “상품군별 평균 구매 금액” 같은 질문에 답할 때 사용한다. 이 구문의 동작 방식을 이해하는 것이 처음 배우는 사람에게는 가장 중요하다. GROUP BY는 지정한 컬럼의 같은 값을 가진 행들을 하나의 그룹으로 뭉친 뒤, 그 그룹에 대해 집계 함수를 적용한다. 집계 함수란 SUM, COUNT, AVG, MAX, MIN처럼 여러 행의 값을 계산해 하나의 결과로 만드는 함수를 의미한다. 여기서 자주 하는 실수가 있다. GROUP BY로 묶지 않은 일반 컬럼을 SELECT 절에 함께 넣는 것이다. 이 경우 데이터베이스는 어느 값을 보여줄지 알 수 없어 오류를 반환한다. 따라서 SELECT 절에는 그룹화한 컬럼과 집계 함수 결과만 위치해야 한다는 원칙을 꼭 기억해야 한다.

이제 자주 등장하는 질문인 “WHERE와 GROUP BY의 실행 순서”에 대해 짚고 넘어가자. SQL 쿼리는 작성 순서와 실행 순서가 다르다. 먼저 FROM 절에서 테이블을 읽은 다음, WHERE 절이 적용되어 조건에 맞는 행만 남긴다. 그 후에 GROUP BY가 그룹을 만들고, 집계 함수가 계산된다. 마지막으로 ORDER BY가 결과를 정렬한다. 이 순서가 중요한 이유는, WHERE에서 조건을 걸어 미리 데이터를 줄이지 않으면 GROUP BY가 불필요하게 많은 행을 처리해야 하기 때문이다. 또한, 집계 함수의 결과에 조건을 걸고 싶다면 WHERE를 사용할 수 없고 HAVING이라는 별도의 구문이 필요하다는 점도 알아두면 좋다. 다만 이 글에서 다루는 기본 범위에서는 WHERE로 충분한 경우가 대부분이다.

실전 문제 하나를 풀어보자. 지난 분기 동안 채널별, 그리고 지역별로 매출 합계를 구하고, 매출이 높은 순서대로 정렬하는 상황을 가정한다. 테이블에는 거래 날짜, 채널, 지역, 매출 금액이라는 네 개의 컬럼이 있다고 하자. 첫 단계로 WHERE 절에서 날짜 범위를 지정해 지난 분기의 데이터만 남긴다. 두 번째로 GROUP BY에 채널과 지역 두 컬럼을 함께 넣으면 채널과 지역의 조합이 같은 행들이 하나의 그룹으로 묶인다. 세 번째로 SELECT 절에 두 그룹 컬럼과 SUM(매출금액)을 배치한다. 마지막으로 ORDER BY 절에 SUM(매출금액)을 DESC로 지정하면 높은 금액부터 낮은 금액 순으로 결과가 출력된다. 여기서 ORDER BY는 집계 함수의 별칭을 사용해도 동작한다. 예를 들어 AS 총매출이라고 이름을 붙인 뒤 ORDER BY 총매출 DESC라고 쓰는 방식이다. 이렇게 하면 결과를 읽는 사람이 직관적으로 이해할 수 있다.

또 다른 상황을 생각해보자. 특정 상품군에서 주문 건수가 일정 수준 이상인 날짜만 뽑고 싶을 때는 GROUP BY와 COUNT 함수를 조합하면 된다. 먼저 상품군을 WHERE로 필터링하고, 날짜별로 그룹을 지은 뒤 COUNT 함수로 주문 건수를 센다. 여기서 주문 건수 조건을 WHERE에 넣을 수 없다는 점이 함정이다. 집계 전의 개별 행에 조건을 거는 것이 아니라 집계 후의 결과에 조건을 걸어야 하므로 HAVING을 사용해야 한다. 이처럼 WHERE와 HAVING의 역할을 구분하는 것은 초보자에게 매우 중요한 학습 포인트가 된다. WHERE는 그룹을 만들기 전에 행을 걸러내고, HAVING은 그룹을 만든 후에 그룹을 걸러낸다고 정리하면 혼동을 줄일 수 있다.

이제 마케터의 실무 관점에서 이 세 구문을 어떻게 조합하면 좋을지 조금 더 구체적으로 살펴보자. 캠페인 성과 분석 업무를 자주 한다면 날짜 조건과 채널 조건을 WHERE에 자주 사용하게 된다. 월간 리포트를 작성한다면 월별로 그룹을 나누고 SUM과 COUNT를 활용해 매출과 주문 건수를 동시에 뽑는 패턴이 반복된다. 지역별 프로모션 효과를 비교하려면 지역 컬럼으로 그룹을 나누고 ORDER BY로 정렬해 최상위 지역과 최하위 지역을 빠르게 식별할 수 있다. 이 모든 과정에서 SQL의 장점은 재사용성이다. 한 번 작성한 쿼리는 날짜 조건만 바꾸면 다음 달에도 동일하게 실행할 수 있고, 반복 작업 시간을 크게 줄여준다.

엑셀에 익숙한 마케터라면 SQL이 처음에 다소 낯설게 느껴질 수 있다. 하지만 데이터를 바라보는 논리적 사고는 이미 충분히 갖추고 있는 경우가 많다. 엑셀에서 SUMIF로 조건을 걸어 합계를 냈다면 SQL의 WHERE와 GROUP BY를 이해하는 데 큰 어려움이 없을 것이다. 중요한 것은 실제 데이터로 직접 연습해보는 것이다. 가능하다면 회사의 샘플 데이터나 공개된 학습용 데이터셋으로 간단한 쿼리부터 실행해보길 권한다. 처음에는 두세 개의 컬럼만 다루는 단순한 쿼리로 시작해, 점차 조건과 그룹화 기준을 늘려가며 복잡도를 높이는 방식이 효과적이다.

이 글에서 다루지 않은 JOIN이나 서브쿼리 같은 고급 구문은 나중에 필요할 때 학습해도 충분하다. 실무에서 마케터가 마주하는 질문의 상당수는 WHERE, GROUP BY, ORDER BY만으로 해결된다는 점을 기억하자. 매출 합계, 주문 건수, 평균 구매 금액, 최다 판매 지역, 기간별 추이 같은 핵심 지표는 이 세 가지 구문의 조합으로 충분히 추출할 수 있다. 데이터 분석과 시각화를 활용한 리포트 작성은 훌륭한 목표다. 하지만 그 출발점은 대량의 데이터를 정확하고 빠르게 집계하는 데 있고, SQL은 그 중에서도 가장 강력한 기초 도구다. 단순한 구문일수록 논리적 사고의 깊이를 요구한다는 사실을 명심하며, 오늘부터 한 줄이라도 직접 쿼리를 작성해보기 바란다.