해결하고자 하는 문제 — 원본 표에서 필요한 일부만 뽑아 다음 단계로 넘기는 작업은 거의 모든 업무 흐름에 존재합니다. 그러나 같은 필터를 매번 수동으로 클릭해서 적용하거나, 복사 붙여넣기로 임시 테이블을 만들면 버전이 엇갈리고 오류가 숨어듭니다. Excel 365와 Google Sheets의 FILTER
함수는 조건을 수식으로 선언하고 결과를 동적으로 흘려보낼 수 있게 해 줍니다. 이 글은 단일 조건이 아니라 여러 조건을 조합한 조건부 서브테이블 파이프라인을 설계하는 법을 실제 데이터와 함께 설명합니다. 클릭이 아닌 규칙으로 움직이는 추출 계층을 만들고, 그 결과를 다른 계산과 보고에 연결하는 것이 목표입니다.
파일 내려받기
- 샘플 원본 CSV: B3_filter_sample.csv
- 결과 CSV(조건 적용 후 서브테이블): B3_filter_result.csv
샘플 데이터 설명
샘플은 2025년 6월부터 7월까지 주문 로그입니다. 지역과 채널, 상태, 금액이 포함되어 있고 결과 파일은 다음 조건을 만족하는 행만 담습니다. 지역이 Seoul, 상태가 Open 또는 Pending, 채널이 Phone이 아님, 금액이 120,000 이상.
원본 B3_filter_sample.csv
컬럼 | 의미 | 예시 | 비고 |
---|---|---|---|
order_id |
주문 번호 | O-0045 | 문자 |
date |
주문 일자 | 2025-07-12 | YYYY-MM-DD |
region |
지역 | Seoul | Seoul Busan Incheon 중 하나 |
channel |
채널 | Online | Online Store Phone 중 하나 |
status |
주문 상태 | Pending | Open Closed Pending Canceled |
category |
품목군 | Stationery | 문자 |
amount |
주문 금액 | 185000 | 정수 |
결과 B3_filter_result.csv
컬럼 | 의미 | 예시 | 계산 개념 |
---|---|---|---|
order_id |
주문 번호 | O-0172 | 원본 유지 |
date |
주문 일자 | 2025-07-28 | 원본 유지 |
region |
지역 | Seoul | 조건 region=Seoul |
channel |
채널 | Store | 조건 channel <> Phone |
status |
상태 | Open | 조건 Open 또는 Pending |
category |
품목군 | Accessory | 원본 유지 |
amount |
주문 금액 | 211000 | 조건 120000 이상 |
파이프라인 설계의 생각법
FILTER는 배열과 조건을 인자로 받아 조건을 만족하는 행만 돌려줍니다. 핵심은 조건을 작은 블록으로 나누고 곱셈으로 결합하는 것입니다. TRUE는 1로, FALSE는 0으로 평가되므로 여러 조건을 곱하면 모두 참인 행만 1이 됩니다. 이를 논리 마스크라고 부릅니다. 범위가 늘어도 같은 규칙이 동작하므로 수동 필터 대비 유지 보수성이 압도적으로 높습니다.
Excel 365 레시피
기본형 다중 조건
=FILTER(
Table1,
(Table1[region]="Seoul")
* ISNUMBER(XMATCH(Table1[status], {"Open","Pending"}))
* (Table1[channel]<>"Phone")
* (Table1[amount]>=120000)
)
XMATCH를 이용해 상태가 집합에 포함되는지를 판정했습니다. 포함 여부는 숫자 또는 오류로 나오는데 ISNUMBER로 TRUE FALSE로 변환하도록 처리했습니다.
기간 조건을 추가한 버전
=LET(
d, Table1[date],
startd, DATE(2025,6,1),
endd, DATE(2025,7,31),
FILTER(
Table1,
(Table1[region]="Seoul")
* ISNUMBER(XMATCH(Table1[status], {"Open","Pending"}))
* (Table1[channel]<>"Phone")
* (Table1[amount]>=120000)
* (d>=startd) * (d<=endd)
)
)
기간 경계는 별도 변수로 빼 두면 재사용도 쉽고 실수도 줄어듭니다.
필요한 열만 남기는 후처리
=LET(
sub, 위_필터_수식,
CHOOSECOLS(sub, XMATCH({"date","region","status","amount"}, TAKE(Table1[#Headers],1)))
)
열 이름을 직접 지정해도 되지만 헤더를 XMATCH로 찾으면 열 순서가 바뀌어도 안전합니다.
폴백 텍스트와 오류 처리
=IFERROR(
FILTER(Table1, 조건_묶음),
"해당 조건을 만족하는 데이터가 없습니다"
)
보고 문맥에서는 빈 배열보다 메시지가 낫습니다. 다만 후속 계산이 필요한 표라면 공백 문자열 대신 빈 배열을 반환하는 편이 안전합니다.
Google Sheets 레시피
기본형 다중 조건
=FILTER(
A2:G,
B2:B>=DATE(2025,6,1),
B2:B<=DATE(2025,7,31),
C2:C="Seoul",
(E2:E="Open") + (E2:E="Pending"),
D2:D<>"Phone",
G2:G>=120000
)
Sheets에서는 TRUE FALSE 조합을 덧셈으로 결합해도 됩니다. 둘 중 하나라도 참이면 1이 되므로 OR 조건을 표현할 수 있습니다. AND는 FILTER 인자에 조건을 나란히 적으면 됩니다.
사전 조건을 테이블로 관리하기
=LET(
params, J2:K10,
rgn, INDEX(params, XMATCH("region", INDEX(params,,1), 0), 2),
minv, INDEX(params, XMATCH("min_amount", INDEX(params,,1), 0), 2),
FILTER(A2:G, C2:C=rgn, G2:G>=minv)
)
조건을 시트 한쪽에 모아 텍스트로 적어두면 협업자도 쉽게 조작할 수 있습니다. 수식은 그 테이블을 읽어와 FILTER에 적용합니다.
성능과 유지 보수 관점의 요령
- 조건을 LET 내부 변수로 선언하면 같은 계산을 반복하지 않게 됩니다. 특히 날짜 범위와 상태 집합은 재사용도가 높습니다.
- FILTER 결과는 동적 범위이므로 다음 단계에서
HSTACK
VSTACK
과 결합해 더 큰 파이프라인의 일부로 흘려보낼 수 있습니다. - 수치 필터를 다중 범위로 구성할 때는
(x>=a)*(x<=b) + (x>=c)*(x<=d)
와 같이 OR 블록을 명확히 나눠 적는 것이 디버깅에 유리합니다. - 정렬은 FILTER 다음에
SORT
를 붙이는 방식이 가장 단순하고 빠릅니다. 정렬 기준이 여러 개일 때는SORTBY
가 읽기 좋습니다.
검증 체크리스트
-- 필터 전후 행수 대조
=ROWS(결과범위) = COUNTIFS(
원본[region], "Seoul",
원본[status], {"Open","Pending"},
원본[channel], "<>Phone",
원본[amount], ">=120000"
)
-- 금액 최소값 재확인
=MIN(INDEX(결과범위,, XMATCH("amount", 결과헤더, 0))) >= 120000
-- OR 조건 누락 여부
=COUNTIF(결과[status], "Open") + COUNTIF(결과[status], "Pending") = ROWS(결과)
응용 아이디어
- 슬라이싱과 병행 — FILTER로 서브테이블을 만든 다음 최근 N행만 쓰고 싶다면
CHOOSEROWS(FILTER(...), SEQUENCE(N,1,ROWS(...)-N+1))
형태로 결합하십시오. - 집계와 결합 — FILTER 결과에
SUM
AVERAGE
UNIQUE
를 바로 적용하면 조건별 요약표를 빠르게 만들 수 있습니다. - 텍스트 리포트 — 결과의 합계와 건수를
CONCAT
또는TEXTJOIN
으로 문장화하면 대시보드 없이도 보고가 가능합니다.
자주 발생하는 문제와 해결
- 날짜가 텍스트 — 비교가 올바르게 동작하지 않습니다. DATEVALUE로 먼저 변환하십시오.
- 대소문자 표기 불일치 — 지역 코드나 상태가 혼재되어 있으면 매칭 실패가 납니다. 입력 단계에서 UPPER와 TRIM으로 정규화하세요.
- 빈 결과 처리 — 후속 계산이 필요하다면 빈 배열을 그대로 넘기고, 사용자 메시지가 필요하다면 IFERROR로 교체합니다. 두 용도를 혼용하면 예상 외 문제가 생깁니다.
정리
조건부 서브테이블은 모든 자동화의 첫 단추입니다. FILTER를 중심으로 조건을 벡터화하고, LET으로 변수화한 뒤, CHOOSECOLS와 SORT 계열로 다듬으면 일관된 추출 파이프라인을 만들 수 있습니다. 위 CSV를 내려받아 본문 수식을 그대로 붙여 보십시오. 클릭이 아닌 규칙으로 정의된 추출 흐름이 얼마나 단단한지 바로 체감하실 수 있습니다.