# Google Sheets 함수 마스터하기 (7/10): QUERY 함수 - 스프레드시트에서 SQL 사용하기 ## 이전 편 복습 6편에서는 ARRAYFORMULA로 하나의 수식으로 전체 열을 처리하는 방법을 배웠습니다. 오늘은 Google Sheets에서 가장 강력한 함수 중 하나인 **QUERY**를 알아봅니다! --- ## QUERY란? QUERY 함수는 Google Visualization API Query Language를 사용하여 데이터를 조회합니다. SQL과 매우 유사한 문법으로 SELECT, WHERE, ORDER BY, GROUP BY 등을 사용할 수 있습니다. ### 기본 문법 ``` =QUERY(데이터범위, 쿼리문, [헤더수]) ``` | 인수 | 설명 | |------|------| | 데이터범위 | 조회할 데이터 범위 | | 쿼리문 | SQL 유사 쿼리문 | | 헤더수 | 헤더 행 수 (기본값: 자동 감지) | --- ## 예제 데이터 ### 판매 데이터 (A1:F11) | 날짜 | 제품 | 카테고리 | 지역 | 수량 | 금액 | |------|------|----------|------|------|------| | 2024-01-05 | 노트북 | 전자제품 | 서울 | 5 | 7500000 | | 2024-01-08 | 마우스 | 전자제품 | 부산 | 20 | 700000 | | 2024-01-12 | 책상 | 가구 | 서울 | 3 | 1350000 | | 2024-01-15 | 의자 | 가구 | 대구 | 10 | 2800000 | | 2024-01-20 | 노트북 | 전자제품 | 서울 | 8 | 12000000 | | 2024-01-25 | 키보드 | 전자제품 | 부산 | 15 | 1335000 | | 2024-02-01 | 책상 | 가구 | 대구 | 5 | 2250000 | | 2024-02-05 | 모니터 | 전자제품 | 서울 | 7 | 3150000 | | 2024-02-10 | 의자 | 가구 | 부산 | 12 | 3360000 | | 2024-02-15 | 노트북 | 전자제품 | 대구 | 4 | 6000000 | --- ## 기본 쿼리 ### SELECT: 열 선택 #### 모든 열 선택 ``` =QUERY(A1:F11, "SELECT *") ``` #### 특정 열만 선택 ``` =QUERY(A1:F11, "SELECT B, E, F") ``` **결과**: 제품, 수량, 금액 열만 표시 #### 열 순서 변경 ``` =QUERY(A1:F11, "SELECT F, B, D") ``` **결과**: 금액, 제품, 지역 순서로 표시 --- ### WHERE: 조건 필터 #### 특정 카테고리만 ``` =QUERY(A1:F11, "SELECT * WHERE C = '전자제품'") ``` **결과**: 전자제품만 표시 #### 금액 조건 ``` =QUERY(A1:F11, "SELECT * WHERE F > 3000000") ``` **결과**: 금액이 300만원 초과인 행만 #### 여러 조건 (AND) ``` =QUERY(A1:F11, "SELECT * WHERE C = '전자제품' AND D = '서울'") ``` #### 여러 조건 (OR) ``` =QUERY(A1:F11, "SELECT * WHERE D = '서울' OR D = '부산'") ``` --- ### ORDER BY: 정렬 #### 오름차순 정렬 ``` =QUERY(A1:F11, "SELECT * ORDER BY F") ``` **결과**: 금액 기준 오름차순 #### 내림차순 정렬 ``` =QUERY(A1:F11, "SELECT * ORDER BY F DESC") ``` **결과**: 금액 기준 내림차순 #### 복합 정렬 ``` =QUERY(A1:F11, "SELECT * ORDER BY C, F DESC") ``` **결과**: 카테고리 오름차순, 같은 카테고리 내에서 금액 내림차순 --- ### LIMIT: 결과 제한 #### 상위 5개만 ``` =QUERY(A1:F11, "SELECT * ORDER BY F DESC LIMIT 5") ``` **결과**: 금액 기준 상위 5개 판매 --- ## 집계 함수 ### COUNT: 개수 ``` =QUERY(A1:F11, "SELECT C, COUNT(B) GROUP BY C") ``` **결과**: | 카테고리 | count | |----------|-------| | 가구 | 4 | | 전자제품 | 6 | --- ### SUM: 합계 ``` =QUERY(A1:F11, "SELECT C, SUM(F) GROUP BY C") ``` **결과**: | 카테고리 | sum | |----------|-----| | 가구 | 9760000 | | 전자제품 | 30685000 | --- ### AVG: 평균 ``` =QUERY(A1:F11, "SELECT D, AVG(F) GROUP BY D") ``` **결과**: 지역별 평균 금액 --- ### MAX, MIN ``` =QUERY(A1:F11, "SELECT C, MAX(F), MIN(F) GROUP BY C") ``` **결과**: 카테고리별 최대/최소 금액 --- ## 복합 쿼리 ### GROUP BY + 조건 ``` =QUERY(A1:F11, "SELECT D, SUM(F) WHERE C = '전자제품' GROUP BY D ORDER BY SUM(F) DESC") ``` **결과**: 전자제품의 지역별 총 금액 (내림차순) --- ### LABEL: 헤더 변경 ``` =QUERY(A1:F11, "SELECT C, SUM(F) GROUP BY C LABEL SUM(F) '총매출'") ``` **결과**: | 카테고리 | 총매출 | |----------|--------| | 가구 | 9760000 | | 전자제품 | 30685000 | --- ### FORMAT: 서식 지정 ``` =QUERY(A1:F11, "SELECT A, B, F FORMAT A 'YYYY-MM-DD', F '#,##0원'") ``` **결과**: 날짜와 금액에 서식 적용 --- ## 셀 참조 활용 ### 동적 조건 G1 셀에 "서울"이 입력되어 있다면: ``` =QUERY(A1:F11, "SELECT * WHERE D = '"&G1&"'") ``` ### 숫자 조건 H1 셀에 5000000이 있다면: ``` =QUERY(A1:F11, "SELECT * WHERE F > "&H1) ``` ### 드롭다운과 연동 ``` =QUERY(A1:F11, "SELECT * WHERE C = '"&$G$1&"' AND D = '"&$G$2&"'") ``` --- ## 날짜 처리 ### 특정 날짜 이후 ``` =QUERY(A1:F11, "SELECT * WHERE A > date '2024-01-15'") ``` ### 날짜 범위 ``` =QUERY(A1:F11, "SELECT * WHERE A >= date '2024-01-10' AND A <= date '2024-01-31'") ``` ### 셀 참조 날짜 G1에 날짜가 있다면: ``` =QUERY(A1:F11, "SELECT * WHERE A >= date '"&TEXT(G1,"yyyy-MM-dd")&"'") ``` --- ## 문자열 함수 ### CONTAINS: 포함 ``` =QUERY(A1:F11, "SELECT * WHERE B CONTAINS '노트'") ``` **결과**: 제품명에 "노트"가 포함된 행 ### STARTS WITH: 시작 ``` =QUERY(A1:F11, "SELECT * WHERE B STARTS WITH '노'") ``` ### ENDS WITH: 끝 ``` =QUERY(A1:F11, "SELECT * WHERE B ENDS WITH '상'") ``` ### LIKE: 패턴 매칭 ``` =QUERY(A1:F11, "SELECT * WHERE B LIKE '%북'") ``` --- ## PIVOT: 피벗 테이블 ### 카테고리별 지역 금액 ``` =QUERY(A1:F11, "SELECT C, SUM(F) PIVOT D") ``` **결과**: | 카테고리 | 서울 | 부산 | 대구 | |----------|------|------|------| | 가구 | 1350000 | 3360000 | 5050000 | | 전자제품 | 22650000 | 2035000 | 6000000 | --- ## 다중 시트 QUERY ### 다른 시트 데이터 조회 ``` =QUERY('판매데이터'!A1:F100, "SELECT * WHERE C = '전자제품'") ``` ### 여러 시트 결합 ``` =QUERY({시트1!A2:F100; 시트2!A2:F100}, "SELECT * WHERE Col1 IS NOT NULL") ``` **주의**: 결합 시 열 이름 대신 Col1, Col2... 사용 --- ## 빈 값 처리 ### NULL이 아닌 행만 ``` =QUERY(A1:F11, "SELECT * WHERE B IS NOT NULL") ``` ### NULL 값 대체 ``` =ARRAYFORMULA(IF(QUERY결과="", "N/A", QUERY결과)) ``` --- ## 자주 사용하는 패턴 ### 패턴 1: 동적 필터 대시보드 ``` =QUERY(데이터!A:F, "SELECT B, SUM(F) WHERE C = '"&$A$1&"' AND D = '"&$B$1&"' GROUP BY B ORDER BY SUM(F) DESC LABEL SUM(F) '매출'") ``` ### 패턴 2: 월별 집계 ``` =QUERY(A1:F100, "SELECT MONTH(A)+1, SUM(F) GROUP BY MONTH(A)+1 LABEL MONTH(A)+1 '월', SUM(F) '매출'") ``` ### 패턴 3: Top N 추출 ``` =QUERY(A1:F100, "SELECT B, SUM(F) GROUP BY B ORDER BY SUM(F) DESC LIMIT 10") ``` --- ## 에러 해결 ### #VALUE! 에러 **원인**: 쿼리 문법 오류 **해결**: - 문자열은 작은따옴표로 감싸기: `'서울'` - 열 문자 확인: A, B, C... - 함수명 확인: SELECT, WHERE 등 ### 헤더 문제 **해결**: 3번째 인수로 헤더 수 지정 ``` =QUERY(A1:F100, "SELECT *", 1) // 헤더 1행 ``` ### 날짜 형식 오류 **해결**: date 키워드와 올바른 형식 사용 ``` WHERE A > date '2024-01-15' // 올바름 WHERE A > '2024-01-15' // 잘못됨 ``` --- ## 정리 | 용도 | 쿼리 예시 | |------|----------| | 열 선택 | `SELECT B, C, F` | | 필터 | `WHERE C = '값'` | | 정렬 | `ORDER BY F DESC` | | 제한 | `LIMIT 10` | | 그룹화 | `GROUP BY C` | | 합계 | `SUM(F)` | | 개수 | `COUNT(B)` | | 헤더 변경 | `LABEL SUM(F) '총합'` | | 피벗 | `PIVOT D` | | 날짜 조건 | `WHERE A > date '2024-01-01'` | --- ## 핵심 포인트 1. **SQL과 유사**하지만 완전히 같지는 않음 2. **열은 A, B, C...** 문자로 참조 3. **문자열은 작은따옴표**로 감싸기 4. **셀 참조**로 동적 쿼리 가능 5. **집계 함수**로 강력한 분석 가능 6. **PIVOT**으로 교차 분석 가능 --- ## 다음 편 예고 **[8편: FILTER & SORT 함수]**에서는 QUERY보다 간단하지만 강력한 FILTER와 SORT 함수를 배웁니다. 동적 데이터 필터링의 또 다른 방법! --- *이 글이 도움이 되셨다면 시리즈의 다른 글도 확인해 보세요!*