# Google Sheets 함수 마스터하기 (8/10): FILTER & SORT - 동적 데이터 처리의 핵심 ## 이전 편 복습 7편에서는 QUERY 함수로 SQL 스타일의 데이터 조회를 배웠습니다. 오늘은 QUERY보다 간단하면서도 강력한 **FILTER**와 **SORT** 함수를 알아봅니다! --- ## Part 1: FILTER 함수 ### FILTER란? FILTER는 조건에 맞는 데이터만 추출하는 함수입니다. QUERY보다 문법이 간단하고 직관적입니다. ### 기본 문법 ``` =FILTER(범위, 조건1, [조건2], ...) ``` | 인수 | 설명 | |------|------| | 범위 | 필터링할 데이터 범위 | | 조건 | TRUE/FALSE를 반환하는 조건식 | --- ## 예제 데이터 (A1:E11) | 이름 | 부서 | 직급 | 연봉 | 입사년도 | |------|------|------|------|----------| | 김철수 | 개발 | 과장 | 6000 | 2018 | | 이영희 | 마케팅 | 대리 | 4500 | 2020 | | 박민수 | 개발 | 차장 | 7500 | 2015 | | 정수진 | 인사 | 사원 | 3500 | 2022 | | 최동훈 | 영업 | 부장 | 8500 | 2012 | | 한지민 | 개발 | 대리 | 4800 | 2021 | | 오세훈 | 마케팅 | 과장 | 5800 | 2017 | | 강다니엘 | 영업 | 대리 | 4200 | 2020 | | 윤아름 | 인사 | 과장 | 5500 | 2016 | | 장서연 | 개발 | 사원 | 3800 | 2023 | --- ## FILTER 기본 예제 ### 예제 1: 단일 조건 #### 개발팀만 추출 ``` =FILTER(A2:E11, B2:B11="개발") ``` **결과**: | 김철수 | 개발 | 과장 | 6000 | 2018 | | 박민수 | 개발 | 차장 | 7500 | 2015 | | 한지민 | 개발 | 대리 | 4800 | 2021 | | 장서연 | 개발 | 사원 | 3800 | 2023 | --- ### 예제 2: 숫자 조건 #### 연봉 5000만원 이상 ``` =FILTER(A2:E11, D2:D11>=5000) ``` **결과**: 연봉 5000 이상인 직원만 #### 2020년 이후 입사 ``` =FILTER(A2:E11, E2:E11>=2020) ``` --- ### 예제 3: 다중 조건 (AND) #### 개발팀이면서 연봉 5000 이상 ``` =FILTER(A2:E11, (B2:B11="개발")*(D2:D11>=5000)) ``` **또는**: ``` =FILTER(A2:E11, B2:B11="개발", D2:D11>=5000) ``` **결과**: | 김철수 | 개발 | 과장 | 6000 | 2018 | | 박민수 | 개발 | 차장 | 7500 | 2015 | --- ### 예제 4: 다중 조건 (OR) #### 개발팀 또는 마케팅팀 ``` =FILTER(A2:E11, (B2:B11="개발")+(B2:B11="마케팅")) ``` **팁**: - `*`는 AND (모든 조건 참) - `+`는 OR (하나라도 참) --- ### 예제 5: NOT 조건 #### 개발팀 제외 ``` =FILTER(A2:E11, B2:B11<>"개발") ``` --- ## FILTER 고급 활용 ### 특정 열만 반환 이름과 연봉만 필요할 때: ``` =FILTER({A2:A11, D2:D11}, B2:B11="개발") ``` **결과**: | 김철수 | 6000 | | 박민수 | 7500 | | 한지민 | 4800 | | 장서연 | 3800 | --- ### 셀 참조로 동적 필터 G1에 "마케팅"이 입력되어 있다면: ``` =FILTER(A2:E11, B2:B11=G1) ``` 드롭다운과 연동하면 동적 대시보드 완성! --- ### 결과 없을 때 처리 조건에 맞는 데이터가 없으면 에러가 발생합니다. ``` =IFERROR(FILTER(A2:E11, B2:B11="없는부서"), "결과 없음") ``` --- ### 부분 일치 검색 이름에 "수"가 포함된 직원: ``` =FILTER(A2:E11, REGEXMATCH(A2:A11, "수")) ``` --- ## Part 2: SORT 함수 ### SORT란? SORT는 데이터를 정렬하는 함수입니다. 여러 열 기준 정렬도 간단합니다. ### 기본 문법 ``` =SORT(범위, 정렬열, 오름차순여부, [정렬열2], [오름차순여부2], ...) ``` | 인수 | 설명 | |------|------| | 범위 | 정렬할 데이터 범위 | | 정렬열 | 정렬 기준 열 번호 | | 오름차순여부 | TRUE=오름차순, FALSE=내림차순 | --- ## SORT 기본 예제 ### 예제 1: 단일 열 정렬 #### 이름 오름차순 ``` =SORT(A2:E11, 1, TRUE) ``` #### 연봉 내림차순 ``` =SORT(A2:E11, 4, FALSE) ``` **결과**: 연봉이 높은 순서대로 정렬 --- ### 예제 2: 다중 열 정렬 #### 부서별, 연봉 내림차순 ``` =SORT(A2:E11, 2, TRUE, 4, FALSE) ``` **결과**: 먼저 부서 이름순으로, 같은 부서 내에서는 연봉 높은 순 --- ### 예제 3: 열 범위로 정렬 열 번호 대신 실제 열 범위를 사용: ``` =SORT(A2:E11, D2:D11, FALSE) ``` 연봉(D열) 기준 내림차순 --- ## FILTER + SORT 조합 ### 개발팀만 연봉순 정렬 ``` =SORT(FILTER(A2:E11, B2:B11="개발"), 4, FALSE) ``` **결과**: | 박민수 | 개발 | 차장 | 7500 | 2015 | | 김철수 | 개발 | 과장 | 6000 | 2018 | | 한지민 | 개발 | 대리 | 4800 | 2021 | | 장서연 | 개발 | 사원 | 3800 | 2023 | --- ### 연봉 5000 이상, 입사년도순 ``` =SORT(FILTER(A2:E11, D2:D11>=5000), 5, TRUE) ``` --- ## UNIQUE 함수 ### UNIQUE란? 중복을 제거하고 고유값만 반환합니다. ``` =UNIQUE(범위) ``` --- ### 예제: 부서 목록 추출 ``` =UNIQUE(B2:B11) ``` **결과**: - 개발 - 마케팅 - 인사 - 영업 --- ### 정렬된 고유값 ``` =SORT(UNIQUE(B2:B11)) ``` --- ## FILTER + UNIQUE 조합 ### 부서별 최고 연봉자 각 부서에서 가장 연봉이 높은 사람: ``` =ARRAYFORMULA( FILTER(A2:E11, D2:D11=VLOOKUP(B2:B11, QUERY(A2:E11, "SELECT B, MAX(D) GROUP BY B"), 2, FALSE))) ``` 또는 MAXIFS 활용: ``` =FILTER(A2:E11, D2:D11=MAXIFS(D2:D11, B2:B11, B2:B11)) ``` --- ## SORTN 함수 ### SORTN이란? 정렬 후 상위 N개만 반환합니다. Top N 추출에 유용! ### 기본 문법 ``` =SORTN(범위, n, [타이모드], [정렬열], [오름차순]) ``` --- ### 예제: 연봉 Top 5 ``` =SORTN(A2:E11, 5, 0, 4, FALSE) ``` **결과**: 연봉 상위 5명 --- ### 부서별 Top 1 (중복 타이 허용) ``` =SORTN(SORT(A2:E11, 4, FALSE), 9^9, 2, 2, TRUE) ``` 타이모드 2는 각 그룹에서 첫 번째만 선택 --- ## 실무 활용 패턴 ### 패턴 1: 동적 검색 대시보드 검색어가 G1에 있을 때: ``` =IFERROR( FILTER(A2:E11, REGEXMATCH(A2:A11, "(?i)"&G1)+ REGEXMATCH(B2:B11, "(?i)"&G1)), "검색 결과 없음") ``` 이름이나 부서에 검색어가 포함된 행 반환 --- ### 패턴 2: 날짜 범위 필터 날짜가 A열에 있고, G1=시작일, G2=종료일: ``` =FILTER(A2:E11, (A2:A11>=G1)*(A2:A11<=G2)) ``` --- ### 패턴 3: 다중 선택 필터 G1:G3에 선택된 부서 목록이 있을 때: ``` =FILTER(A2:E11, COUNTIF(G1:G3, B2:B11)>0) ``` --- ### 패턴 4: 최근 N개 데이터 가장 최근 입사한 5명: ``` =SORTN(A2:E11, 5, 0, 5, FALSE) ``` --- ## QUERY vs FILTER 비교 | 특성 | QUERY | FILTER | |------|-------|--------| | 문법 | SQL 스타일 | 배열 조건 | | 학습 난이도 | 중간 | 쉬움 | | 그룹화 | O (GROUP BY) | X | | 피벗 | O | X | | 성능 | 보통 | 빠름 | | 중첩 | 어려움 | 쉬움 | | 셀 참조 | 복잡함 | 간단함 | ### 언제 무엇을 사용할까? - **FILTER**: 간단한 필터링, 다른 함수와 조합 - **QUERY**: 집계, 그룹화, 복잡한 조회 --- ## 에러 처리 ### 결과 없음 처리 ``` =IFERROR(FILTER(범위, 조건), "결과 없음") ``` ### 빈 결과를 빈 배열로 ``` =IFERROR(FILTER(범위, 조건), {""}) ``` --- ## 정리 ### FILTER | 상황 | 수식 | |------|------| | 단일 조건 | `=FILTER(범위, 열="값")` | | AND 조건 | `=FILTER(범위, 조건1, 조건2)` | | OR 조건 | `=FILTER(범위, 조건1+조건2)` | | NOT 조건 | `=FILTER(범위, 열<>"값")` | | 부분 일치 | `=FILTER(범위, REGEXMATCH(열, "패턴"))` | | 에러 처리 | `=IFERROR(FILTER(...), "없음")` | ### SORT | 상황 | 수식 | |------|------| | 오름차순 | `=SORT(범위, 열번호, TRUE)` | | 내림차순 | `=SORT(범위, 열번호, FALSE)` | | 다중 정렬 | `=SORT(범위, 열1, TRUE, 열2, FALSE)` | | FILTER 조합 | `=SORT(FILTER(...), 열번호, FALSE)` | --- ## 핵심 포인트 1. **FILTER는 조건이 직관적** - 배열 비교 연산 2. **`*`는 AND, `+`는 OR** - 다중 조건 처리 3. **SORT와 조합**하면 정렬된 필터 결과 4. **SORTN**으로 Top N 쉽게 추출 5. **UNIQUE**로 고유값 목록 생성 6. **IFERROR**로 결과 없음 처리 --- ## 다음 편 예고 **[9편: IMPORTRANGE]**에서는 다른 Google Sheets 파일의 데이터를 가져오는 방법을 배웁니다. 여러 파일을 연결하여 통합 관리! --- *이 글이 도움이 되셨다면 시리즈의 다른 글도 확인해 보세요!*