Google Sheets Tips

Hàm QUERY Trong Google Sheets: Hướng Dẫn Toàn Diện Với 30+ Ví Dụ

Tuân HoangTuân Hoang
26 tháng 2, 2026
Cập nhật: 25 tháng 3, 2026
30 phút đọc
Hàm QUERY Trong Google Sheets: Hướng Dẫn Toàn Diện Với 30+ Ví Dụ

Giới Thiệu: QUERY - Hàm Mạnh Nhất Trong Google Sheets

Nếu bạn chỉ được học một hàm duy nhất trong Google Sheets, hãy chọn hàm QUERY. Đây là hàm mạnh nhất, linh hoạt nhất và có khả năng thay thế hàng chục hàm khác. QUERY cho phép bạn truy vấn dữ liệu ngay trong spreadsheet bằng ngôn ngữ tương tự SQL (Structured Query Language) - ngôn ngữ chuẩn của các hệ quản trị cơ sở dữ liệu.

Hãy tưởng tượng bạn có một bảng dữ liệu 10.000 dòng về đơn hàng. Với các hàm truyền thống như VLOOKUP, FILTER, SUMIFS, bạn cần kết hợp nhiều hàm lồng nhau phức tạp. Nhưng với QUERY, chỉ cần một công thức duy nhất, bạn có thể lọc, sắp xếp, nhóm, tính tổng và định dạng kết quả - giống hệt như viết câu truy vấn SQL.

Tại sao hàm QUERY là "vũ khí tối thượng"?

  • Thay thế nhiều hàm: QUERY = VLOOKUP + FILTER + SORT + SUMIFS + COUNTIFS kết hợp lại
  • Hiệu suất cao: Xử lý nhanh hơn nhiều so với việc lồng nhiều hàm
  • Dễ đọc: Cú pháp giống SQL, ai biết SQL sẽ dùng ngay được
  • Linh hoạt: Có thể SELECT, WHERE, GROUP BY, ORDER BY, PIVOT, LIMIT trong một câu lệnh
  • Kết hợp mạnh: Hoạt động tốt với IMPORTRANGE, ARRAYFORMULA và các hàm khác

Bài viết này phù hợp cho:

  • Người dùng Google Sheets muốn nâng cao kỹ năng phân tích dữ liệu
  • Data Analyst, Business Analyst làm việc với spreadsheet
  • Kế toán, quản lý cần tạo báo cáo tự động từ dữ liệu lớn
  • Developer muốn tận dụng SQL skills trong Google Sheets
  • Chủ doanh nghiệp cần phân tích doanh thu, kho hàng, khách hàng

Trong bài viết này, chúng ta sẽ đi từ cú pháp cơ bản đến nâng cao với 30+ ví dụ thực tế, bao gồm quản lý bán hàng, kho hàng, nhân sự và tài chính. Mỗi ví dụ đều có công thức copy-paste được ngay.

Dữ Liệu Mẫu Sử Dụng Trong Bài

Để theo dõi các ví dụ, hãy tạo một sheet với dữ liệu mẫu sau (sheet tên DonHang):

A: MaDH B: NgayDat C: KhachHang D: SanPham E: SoLuong F: DonGia G: ThanhTien H: TrangThai I: NhanVien J: KhuVuc
DH0012026-01-05Nguyễn Văn ALaptop Dell21500000030000000Hoàn thànhTrần Thị BHCM
DH0022026-01-08Lê Văn CiPhone 16525000000125000000Hoàn thànhPhạm Văn DHN
DH0032026-01-12Hoàng Thị EMacBook Pro14500000045000000Đang giaoTrần Thị BDN
DH0042026-01-15Võ Văn FSamsung S2532200000066000000Hoàn thànhNgô Thị GHCM
DH0052026-02-01Đỗ Văn HiPad Pro428000000112000000Đã hủyPhạm Văn DHN

Dữ liệu nằm ở A1:J (hàng 1 là header). Các ví dụ bên dưới đều tham chiếu đến bảng này.

Cú Pháp Hàm QUERY

=QUERY(data, query, [headers])
Tham số Bắt buộc Mô tả
dataPhạm vi dữ liệu cần truy vấn (VD: A1:J100 hoặc DonHang!A:J)
queryChuỗi truy vấn viết bằng Google Visualization API Query Language (giống SQL)
headersKhôngSố dòng header trong data. Mặc định: -1 (tự đoán). Đặt 1 nếu dòng đầu là tiêu đề.

Lưu ý quan trọng:

  • Trong query string, các cột được tham chiếu bằng chữ cái (A, B, C...) - tương ứng với cột đầu tiên, thứ hai, thứ ba... của data
  • Nếu data bắt đầu từ cột B, thì cột B trong sheet = cột A trong query
  • Chuỗi text trong query phải nằm trong dấu nháy đơn: 'Hoàn thành'
  • Ngày tháng dùng cú pháp: date '2026-01-01'

Ví dụ đơn giản nhất - lấy toàn bộ dữ liệu:

=QUERY(A1:J, "SELECT *", 1)
// Trả về toàn bộ dữ liệu trong bảng A1:J
// Tham số 1 = dòng đầu tiên là header

SELECT - Chọn Cột Dữ Liệu

Mệnh đề SELECT cho phép bạn chọn những cột nào sẽ hiển thị trong kết quả. Tương tự SELECT trong SQL.

Ví dụ 1: Chọn một vài cột cụ thể

=QUERY(A1:J, "SELECT A, C, D, G", 1)
// Kết quả: Chỉ hiển thị MaDH, KhachHang, SanPham, ThanhTien

Ví dụ 2: Chọn tất cả cột

=QUERY(A1:J, "SELECT *", 1)
// Kết quả: Hiển thị toàn bộ 10 cột A đến J

Ví dụ 3: Tính toán trong SELECT

=QUERY(A1:J, "SELECT A, D, G, G*0.1", 1)
// Kết quả: MaDH, SanPham, ThanhTien, và cột tính 10% ThanhTien (VAT)

=QUERY(A1:J, "SELECT A, D, E*F", 1)
// Kết quả: MaDH, SanPham, và SoLuong nhân DonGia

Mẹo SELECT nâng cao:

Bạn có thể dùng các phép tính +, -, *, / trực tiếp trong SELECT. Cũng có thể dùng các hàm tổng hợp: SUM(), COUNT(), AVG(), MAX(), MIN() khi kết hợp với GROUP BY.

WHERE - Lọc Dữ Liệu Theo Điều Kiện

Mệnh đề WHERE là trái tim của QUERY - cho phép bạn lọc dữ liệu theo một hoặc nhiều điều kiện. Dưới đây là tất cả các toán tử so sánh có thể dùng.

Các toán tử so sánh

Toán tử Ý nghĩa Ví dụ
=BằngWHERE H = 'Hoàn thành'
!=Không bằngWHERE H != 'Đã hủy'
>Lớn hơnWHERE G > 50000000
<Nhỏ hơnWHERE E < 3
>=Lớn hơn hoặc bằngWHERE G >= 100000000
<=Nhỏ hơn hoặc bằngWHERE F <= 25000000
containsChứa chuỗiWHERE D contains 'Mac'
starts withBắt đầu bằngWHERE C starts with 'Nguyễn'
ends withKết thúc bằngWHERE A ends with '05'
matchesKhớp regexWHERE A matches 'DH00[1-5]'
is nullGiá trị rỗngWHERE H is null
is not nullKhông rỗngWHERE H is not null

Ví dụ 4: Lọc theo text

=QUERY(A1:J, "SELECT A, C, D, G WHERE H = 'Hoàn thành'", 1)
// Kết quả: Chỉ hiện đơn hàng đã hoàn thành

Ví dụ 5: Lọc theo số

=QUERY(A1:J, "SELECT A, D, G WHERE G > 50000000", 1)
// Kết quả: Đơn hàng có thành tiền trên 50 triệu

=QUERY(A1:J, "SELECT A, D, E, F WHERE E >= 3 AND F > 20000000", 1)
// Kết quả: Đơn hàng mua từ 3 sản phẩm trở lên VÀ đơn giá trên 20 triệu

Ví dụ 6: Lọc theo ngày

=QUERY(A1:J, "SELECT A, B, C, G WHERE B >= date '2026-01-10'", 1)
// Kết quả: Đơn hàng từ ngày 10/01/2026 trở đi

=QUERY(A1:J, "SELECT A, B, G WHERE B >= date '2026-01-01' AND B <= date '2026-01-31'", 1)
// Kết quả: Đơn hàng trong tháng 1/2026

Ví dụ 7: Kết hợp AND và OR

=QUERY(A1:J, "SELECT A, C, D, G WHERE (J = 'HCM' OR J = 'HN') AND H = 'Hoàn thành'", 1)
// Kết quả: Đơn hoàn thành ở HCM hoặc HN

=QUERY(A1:J, "SELECT * WHERE H != 'Đã hủy' AND G > 30000000", 1)
// Kết quả: Đơn chưa hủy và thành tiền trên 30 triệu

Ví dụ 8: Dùng contains, starts with, matches

=QUERY(A1:J, "SELECT A, D, G WHERE D contains 'Pro'", 1)
// Kết quả: Sản phẩm có chứa chữ "Pro" (MacBook Pro, iPad Pro)

=QUERY(A1:J, "SELECT A, C WHERE C starts with 'Nguyễn'", 1)
// Kết quả: Khách hàng họ Nguyễn

=QUERY(A1:J, "SELECT A, D WHERE D matches '.*Phone.*|.*phone.*'", 1)
// Kết quả: Sản phẩm có chứa "Phone" (regex - không phân biệt hoa thường)

Ví dụ 9: Tham chiếu ô trong WHERE (dùng biến)

// Giả sử ô M1 chứa tên khu vực (VD: "HCM")
=QUERY(A1:J, "SELECT A, C, G WHERE J = '"&M1&"'", 1)

// Giả sử M2 chứa số tiền tối thiểu (VD: 50000000)
=QUERY(A1:J, "SELECT A, D, G WHERE G >= "&M2, 1)

// Kết hợp cả text và số từ ô tham chiếu
=QUERY(A1:J, "SELECT A, C, D, G WHERE J = '"&M1&"' AND G >= "&M2, 1)

Cẩn thận với dấu nháy:

Khi tham chiếu ô chứa text, phải bọc trong dấu nháy đơn: "WHERE J = '"&M1&"'". Khi tham chiếu ô chứa số, KHÔNG cần nháy đơn: "WHERE G >= "&M2. Đây là lỗi phổ biến nhất khi viết QUERY.

ORDER BY - Sắp Xếp Kết Quả

Mệnh đề ORDER BY sắp xếp kết quả theo một hoặc nhiều cột. Mặc định sắp xếp tăng dần (ASC). Dùng DESC để giảm dần.

Ví dụ 10: Sắp xếp theo một cột

=QUERY(A1:J, "SELECT A, C, D, G ORDER BY G DESC", 1)
// Kết quả: Sắp xếp theo thành tiền giảm dần (đơn lớn nhất trước)

=QUERY(A1:J, "SELECT A, B, C ORDER BY B ASC", 1)
// Kết quả: Sắp xếp theo ngày đặt tăng dần (cũ nhất trước)

Ví dụ 11: Sắp xếp theo nhiều cột

=QUERY(A1:J, "SELECT J, I, A, G ORDER BY J ASC, G DESC", 1)
// Kết quả: Sắp xếp theo khu vực (A-Z), trong mỗi khu vực sắp theo thành tiền giảm dần

=QUERY(A1:J, "SELECT I, B, G WHERE H = 'Hoàn thành' ORDER BY I ASC, B DESC", 1)
// Kết quả: Đơn hoàn thành, sắp theo nhân viên (A-Z), mỗi NV sắp theo ngày mới nhất

GROUP BY - Nhóm Dữ Liệu Và Tính Tổng Hợp

Mệnh đề GROUP BY nhóm các dòng có cùng giá trị lại với nhau, kết hợp với các hàm tổng hợp (aggregate functions) để tính toán. Đây là tính năng mạnh nhất của QUERY, tương đương GROUP BY trong SQL.

Các hàm tổng hợp

Hàm Ý nghĩa Ví dụ
SUM(col)TổngSUM(G)
COUNT(col)ĐếmCOUNT(A)
AVG(col)Trung bìnhAVG(G)
MAX(col)Giá trị lớn nhấtMAX(G)
MIN(col)Giá trị nhỏ nhấtMIN(F)

Ví dụ 12: Doanh thu theo khu vực

=QUERY(A1:J, "SELECT J, SUM(G), COUNT(A), AVG(G) GROUP BY J", 1)
// Kết quả:
// KhuVuc | sum ThanhTien  | count MaDH | avg ThanhTien
// DN     | 45,000,000     | 1          | 45,000,000
// HCM    | 96,000,000     | 2          | 48,000,000
// HN     | 237,000,000    | 2          | 118,500,000

Ví dụ 13: Doanh thu theo nhân viên

=QUERY(A1:J, "SELECT I, COUNT(A), SUM(G) WHERE H = 'Hoàn thành' GROUP BY I ORDER BY SUM(G) DESC", 1)
// Kết quả: Tổng doanh thu mỗi nhân viên (chỉ đơn hoàn thành), sắp giảm dần

Ví dụ 14: Doanh thu theo trạng thái đơn hàng

=QUERY(A1:J, "SELECT H, COUNT(A), SUM(G), AVG(G), MAX(G), MIN(G) GROUP BY H", 1)
// Kết quả: Thống kê đầy đủ cho mỗi trạng thái
// TrangThai    | count | sum         | avg         | max         | min
// Đã hủy      | 1     | 112,000,000 | 112,000,000 | 112,000,000 | 112,000,000
// Đang giao   | 1     | 45,000,000  | 45,000,000  | 45,000,000  | 45,000,000
// Hoàn thành  | 3     | 221,000,000 | 73,666,667  | 125,000,000 | 30,000,000

Ví dụ 15: Nhóm theo nhiều cột

=QUERY(A1:J, "SELECT J, I, COUNT(A), SUM(G) GROUP BY J, I ORDER BY J, SUM(G) DESC", 1)
// Kết quả: Doanh thu theo khu vực VÀ nhân viên
// KhuVuc | NhanVien   | count | sum
// DN     | Trần Thị B | 1     | 45,000,000
// HCM    | Ngô Thị G  | 1     | 66,000,000
// HCM    | Trần Thị B | 1     | 30,000,000
// HN     | Phạm Văn D | 2     | 237,000,000

PIVOT - Tạo Bảng Xoay (Pivot Table)

Mệnh đề PIVOT biến giá trị của một cột thành các cột header mới - tạo ra bảng chéo (cross-tabulation). Đây là cách tạo Pivot Table nhanh nhất mà không cần dùng tính năng Pivot Table có sẵn của Google Sheets.

Ví dụ 16: Doanh thu khu vực theo trạng thái

=QUERY(A1:J, "SELECT J, SUM(G) GROUP BY J PIVOT H", 1)
// Kết quả:
// KhuVuc | Đã hủy     | Đang giao   | Hoàn thành
// DN     |            | 45,000,000  |
// HCM    |            |             | 96,000,000
// HN     | 112,000,000|             | 125,000,000

Ví dụ 17: Số đơn hàng theo nhân viên và khu vực

=QUERY(A1:J, "SELECT I, COUNT(A) GROUP BY I PIVOT J", 1)
// Kết quả:
// NhanVien    | DN | HCM | HN
// Ngô Thị G  |    | 1   |
// Phạm Văn D |    |     | 2
// Trần Thị B | 1  | 1   |

PIVOT vs GROUP BY:

  • GROUP BY: Kết quả theo chiều dọc (mỗi nhóm 1 dòng)
  • PIVOT: Kết quả theo chiều ngang (mỗi giá trị thành 1 cột mới)
  • PIVOT luôn đi kèm GROUP BY và hàm tổng hợp (SUM, COUNT...)
  • Không thể dùng ORDER BY khi có PIVOT

LIMIT & OFFSET - Phân Trang Dữ Liệu

LIMIT giới hạn số dòng kết quả. OFFSET bỏ qua n dòng đầu tiên. Kết hợp cả hai để phân trang.

Ví dụ 18: Top N kết quả

=QUERY(A1:J, "SELECT A, D, G ORDER BY G DESC LIMIT 3", 1)
// Kết quả: Top 3 đơn hàng có thành tiền cao nhất

=QUERY(A1:J, "SELECT I, SUM(G) GROUP BY I ORDER BY SUM(G) DESC LIMIT 1", 1)
// Kết quả: Nhân viên có tổng doanh thu cao nhất

Ví dụ 19: Phân trang

// Trang 1 (dòng 1-10)
=QUERY(A1:J, "SELECT * LIMIT 10 OFFSET 0", 1)

// Trang 2 (dòng 11-20)
=QUERY(A1:J, "SELECT * LIMIT 10 OFFSET 10", 1)

// Trang 3 (dòng 21-30)
=QUERY(A1:J, "SELECT * LIMIT 10 OFFSET 20", 1)

// Phân trang động: ô P1 chứa số trang (1, 2, 3...)
=QUERY(A1:J, "SELECT * LIMIT 10 OFFSET "&(P1-1)*10, 1)

LABEL - Đổi Tên Cột Kết Quả

Mệnh đề LABEL cho phép đổi tên header của các cột trong kết quả. Rất hữu ích khi dùng GROUP BY vì header mặc định sẽ là "sum ThanhTien", "count MaDH" - khá xấu.

Ví dụ 20: Đổi tên header cho báo cáo

=QUERY(A1:J,
  "SELECT J, COUNT(A), SUM(G), AVG(G)
   GROUP BY J
   ORDER BY SUM(G) DESC
   LABEL J 'Khu Vực',
         COUNT(A) 'Số Đơn Hàng',
         SUM(G) 'Tổng Doanh Thu',
         AVG(G) 'Trung Bình/Đơn'"
, 1)
// Kết quả: Bảng báo cáo với header tiếng Việt đẹp
// Khu Vực | Số Đơn Hàng | Tổng Doanh Thu | Trung Bình/Đơn

Ví dụ 21: Bỏ header (rỗng)

=QUERY(A1:J, "SELECT A, G LABEL A '', G ''", 1)
// Kết quả: Chỉ có data, không có dòng header
// Hữu ích khi muốn append kết quả vào bảng khác

FORMAT - Định Dạng Kết Quả Hiển Thị

Mệnh đề FORMAT cho phép định dạng cách hiển thị của dữ liệu số và ngày tháng trong kết quả.

Ví dụ 22: Định dạng tiền tệ và ngày

=QUERY(A1:J,
  "SELECT A, B, C, G
   WHERE H = 'Hoàn thành'
   FORMAT B 'dd/MM/yyyy',
          G '#,##0 \đ'"
, 1)
// Kết quả:
// MaDH  | NgayDat     | KhachHang    | ThanhTien
// DH001 | 05/01/2026  | Nguyễn Văn A | 30,000,000 đ
// DH002 | 08/01/2026  | Lê Văn C     | 125,000,000 đ
// DH004 | 15/01/2026  | Võ Văn F     | 66,000,000 đ

Ví dụ 23: Định dạng phần trăm

=QUERY(A1:J,
  "SELECT J, SUM(G), SUM(G)/378000000
   GROUP BY J
   FORMAT SUM(G) '#,##0',
          SUM(G)/378000000 '0.0%'
   LABEL J 'Khu Vực',
         SUM(G) 'Doanh Thu',
         SUM(G)/378000000 'Tỷ Trọng'"
, 1)
// Kết quả: Doanh thu khu vực với tỷ trọng phần trăm

Các pattern FORMAT thường dùng:

  • #,##0 - Số nguyên có dấu phân cách hàng nghìn
  • #,##0.00 - Số thập phân 2 chữ số
  • 0.0% - Phần trăm 1 chữ số thập phân
  • dd/MM/yyyy - Ngày dạng 25/02/2026
  • yyyy-MM-dd - Ngày dạng ISO 2026-02-25
  • MM/yyyy - Tháng/Năm: 02/2026

15 Ví Dụ QUERY Thực Tế Trong Công Việc

Dưới đây là 15 ví dụ thực tế ứng dụng hàm QUERY trong các lĩnh vực quản lý bán hàng, kho hàng, nhân sự và tài chính. Mỗi ví dụ đều là một bài toán thực mà bạn có thể gặp trong công việc hàng ngày.

Quản Lý Bán Hàng

Ví dụ 24: Báo cáo doanh thu tháng theo nhân viên

=QUERY(DonHang!A1:J,
  "SELECT I, COUNT(A), SUM(G), AVG(G), MAX(G)
   WHERE H = 'Hoàn thành'
     AND B >= date '2026-01-01'
     AND B <= date '2026-01-31'
   GROUP BY I
   ORDER BY SUM(G) DESC
   LABEL I 'Nhân Viên',
         COUNT(A) 'Số Đơn',
         SUM(G) 'Tổng DT',
         AVG(G) 'TB/Đơn',
         MAX(G) 'Đơn Lớn Nhất'
   FORMAT SUM(G) '#,##0',
          AVG(G) '#,##0',
          MAX(G) '#,##0'"
, 1)

Ví dụ 25: Top 10 khách hàng có doanh thu cao nhất

=QUERY(DonHang!A1:J,
  "SELECT C, COUNT(A), SUM(G)
   WHERE H = 'Hoàn thành'
   GROUP BY C
   ORDER BY SUM(G) DESC
   LIMIT 10
   LABEL C 'Khách Hàng',
         COUNT(A) 'Số Lần Mua',
         SUM(G) 'Tổng Chi Tiêu'"
, 1)

Ví dụ 26: Doanh thu theo sản phẩm - có tỷ trọng

=QUERY(DonHang!A1:J,
  "SELECT D, SUM(E), SUM(G)
   WHERE H != 'Đã hủy'
   GROUP BY D
   ORDER BY SUM(G) DESC
   LABEL D 'Sản Phẩm',
         SUM(E) 'Tổng SL Bán',
         SUM(G) 'Doanh Thu'
   FORMAT SUM(G) '#,##0'"
, 1)

Quản Lý Kho Hàng

Ví dụ 27: Tổng xuất kho theo sản phẩm trong kỳ

Giả sử sheet Kho có cột: A=MaSP, B=TenSP, C=NgayXuat, D=SoLuong, E=LoaiGD (Nhập/Xuất)

=QUERY(Kho!A1:E,
  "SELECT A, B, SUM(D)
   WHERE E = 'Xuất'
     AND C >= date '2026-01-01'
     AND C <= date '2026-01-31'
   GROUP BY A, B
   ORDER BY SUM(D) DESC
   LABEL A 'Mã SP', B 'Tên SP', SUM(D) 'Tổng Xuất'"
, 1)

Ví dụ 28: Sản phẩm tồn kho thấp (cần nhập thêm)

Giả sử sheet TonKho: A=MaSP, B=TenSP, C=TonHienTai, D=TonToiThieu

=QUERY(TonKho!A1:D,
  "SELECT A, B, C, D
   WHERE C <= D
   ORDER BY C ASC
   LABEL A 'Mã SP',
         B 'Tên SP',
         C 'Tồn Hiện Tại',
         D 'Tồn Tối Thiểu'"
, 1)
// Kết quả: Danh sách sản phẩm cần nhập thêm (tồn kho <= mức tối thiểu)

Quản Lý Nhân Sự

Ví dụ 29: Thống kê nhân viên theo phòng ban

Giả sử sheet NhanSu: A=MaNV, B=HoTen, C=PhongBan, D=ChucVu, E=LuongCB, F=NgayVaoLam

=QUERY(NhanSu!A1:F,
  "SELECT C, COUNT(A), AVG(E), MAX(E), MIN(E)
   GROUP BY C
   ORDER BY COUNT(A) DESC
   LABEL C 'Phòng Ban',
         COUNT(A) 'Số NV',
         AVG(E) 'Lương TB',
         MAX(E) 'Lương Cao Nhất',
         MIN(E) 'Lương Thấp Nhất'
   FORMAT AVG(E) '#,##0',
          MAX(E) '#,##0',
          MIN(E) '#,##0'"
, 1)

Ví dụ 30: Nhân viên mới trong 90 ngày gần nhất

=QUERY(NhanSu!A1:F,
  "SELECT A, B, C, D, F
   WHERE F >= date '"&TEXT(TODAY()-90,"yyyy-MM-dd")&"'
   ORDER BY F DESC
   LABEL A 'Mã NV', B 'Họ Tên', C 'Phòng Ban', D 'Chức Vụ', F 'Ngày Vào'
   FORMAT F 'dd/MM/yyyy'"
, 1)

Quản Lý Tài Chính

Ví dụ 31: Doanh thu theo tháng (Time Series)

=QUERY(DonHang!A1:J,
  "SELECT month(B)+1, SUM(G), COUNT(A), AVG(G)
   WHERE H = 'Hoàn thành' AND year(B) = 2026
   GROUP BY month(B)+1
   ORDER BY month(B)+1
   LABEL month(B)+1 'Tháng',
         SUM(G) 'Doanh Thu',
         COUNT(A) 'Số Đơn',
         AVG(G) 'TB/Đơn'
   FORMAT SUM(G) '#,##0',
          AVG(G) '#,##0'"
, 1)
// Lưu ý: month() trả về 0-11, nên +1 để ra tháng 1-12

Ví dụ 32: So sánh doanh thu theo quý

=QUERY(DonHang!A1:J,
  "SELECT quarter(B)+1, SUM(G), COUNT(A)
   WHERE H = 'Hoàn thành'
   GROUP BY quarter(B)+1
   ORDER BY quarter(B)+1
   LABEL quarter(B)+1 'Quý',
         SUM(G) 'Doanh Thu',
         COUNT(A) 'Số Đơn'"
, 1)

Ví dụ 33: Phân tích Pareto - 80/20 khách hàng

// Bước 1: Tổng doanh thu từng khách, sắp giảm dần
=QUERY(DonHang!A1:J,
  "SELECT C, SUM(G)
   WHERE H = 'Hoàn thành'
   GROUP BY C
   ORDER BY SUM(G) DESC
   LABEL C 'Khách Hàng', SUM(G) 'Tổng DT'
   FORMAT SUM(G) '#,##0'"
, 1)
// Bước 2: Dùng kết quả này kết hợp ARRAYFORMULA để tính % tích lũy

Ví dụ 34: Đơn hàng có giá trị bất thường (outlier)

// Đơn hàng có thành tiền > 2x trung bình
=QUERY(A1:J,
  "SELECT A, C, D, G
   WHERE G > "&AVERAGE(G2:G)*2&"
   ORDER BY G DESC
   LABEL A 'Mã ĐH', C 'Khách Hàng', D 'Sản Phẩm', G 'Thành Tiền'"
, 1)

Kết Hợp QUERY Với Các Hàm Khác

Sức mạnh thực sự của QUERY được nhân lên khi kết hợp với các hàm khác trong Google Sheets. Dưới đây là những kết hợp phổ biến và mạnh mẽ nhất.

QUERY + IMPORTRANGE: Truy vấn dữ liệu từ file khác

Đây là combo mạnh nhất - cho phép bạn truy vấn dữ liệu từ một Google Sheets khác mà không cần copy dữ liệu sang.

// Cú pháp
=QUERY(
  IMPORTRANGE("spreadsheet_url", "Sheet1!A1:J"),
  "SELECT Col1, Col3, Col7 WHERE Col8 = 'Hoàn thành'",
  1
)

// Ví dụ thực tế: Lấy doanh thu từ file báo cáo chi nhánh
=QUERY(
  IMPORTRANGE("https://docs.google.com/spreadsheets/d/abc123", "DonHang!A1:J"),
  "SELECT Col1, Col3, Col7
   WHERE Col8 = 'Hoàn thành'
   ORDER BY Col7 DESC",
  1
)

Quan trọng khi dùng IMPORTRANGE:

  • Phải dùng Col1, Col2, Col3... thay vì A, B, C khi QUERY bao bọc IMPORTRANGE
  • Lần đầu sử dụng phải click "Cho phép truy cập" (Allow access)
  • Dữ liệu có thể chậm hơn do phải fetch từ file khác
  • Nên cache kết quả IMPORTRANGE vào sheet trung gian nếu query phức tạp

QUERY + ARRAYFORMULA: Truy vấn trên mảng tính toán

// Tạo mảng với cột tính toán, rồi QUERY trên đó
=QUERY(
  ARRAYFORMULA({A1:C, D1:D*E1:E}),
  "SELECT Col1, Col2, Col4
   WHERE Col4 > 50000000
   ORDER BY Col4 DESC",
  1
)
// {A1:C, D1:D*E1:E} tạo mảng gồm cột A,B,C và cột "D nhân E"

QUERY + Nối nhiều bảng (UNION)

// Nối dữ liệu từ nhiều sheet rồi query
=QUERY(
  {Thang1!A2:G; Thang2!A2:G; Thang3!A2:G},
  "SELECT Col1, Col3, SUM(Col7)
   GROUP BY Col1, Col3
   ORDER BY SUM(Col7) DESC",
  0
)
// Lưu ý: headers = 0 vì đã bỏ header (bắt đầu từ A2)
// Dùng ; để nối theo chiều dọc (stack)

QUERY lồng QUERY (Subquery)

// Bước 1: QUERY trong - nhóm theo nhân viên
// Bước 2: QUERY ngoài - lọc chỉ nhân viên có DT > 100 triệu
=QUERY(
  QUERY(A1:J,
    "SELECT I, SUM(G)
     WHERE H = 'Hoàn thành'
     GROUP BY I", 1),
  "SELECT Col1, Col2
   WHERE Col2 > 100000000
   ORDER BY Col2 DESC
   LABEL Col1 'NV Xuất Sắc', Col2 'Doanh Thu'",
  1
)

QUERY + IF / IFS: Truy vấn động theo điều kiện

// M1 = dropdown chọn loại báo cáo: "Theo Khu Vực" hoặc "Theo Nhân Viên"
=QUERY(A1:J,
  "SELECT "&IF(M1="Theo Khu Vực","J","I")&", COUNT(A), SUM(G)
   WHERE H = 'Hoàn thành'
   GROUP BY "&IF(M1="Theo Khu Vực","J","I")&"
   ORDER BY SUM(G) DESC",
  1
)

Lỗi Thường Gặp Khi Dùng QUERY & Cách Khắc Phục

Khi mới làm quen với hàm QUERY, bạn sẽ gặp nhiều lỗi. Dưới đây là 10 lỗi phổ biến nhất và cách sửa chi tiết.

Lỗi 1: #VALUE! - Không khớp kiểu dữ liệu

Nguyên nhân: Cột chứa cả text và số (mixed data types). Ví dụ cột G (ThanhTien) có ô chứa text "N/A".

// Sai: Cột G có ô text lẫn vào
=QUERY(A1:J, "SELECT SUM(G) GROUP BY J", 1) // #VALUE!

// Sửa: Chuyển dữ liệu sang số trước khi query
// Hoặc lọc bỏ dòng lỗi:
=QUERY(A1:J, "SELECT J, SUM(G) WHERE G is not null GROUP BY J", 1)

Lỗi 2: #REF! - Tham chiếu cột không tồn tại

Nguyên nhân: Query tham chiếu cột K nhưng data chỉ có A:J.

// Sai:
=QUERY(A1:J, "SELECT K", 1) // #REF! - không có cột K trong A:J

// Sửa: Kiểm tra lại phạm vi data
=QUERY(A1:K, "SELECT K", 1) // Mở rộng data đến K

Lỗi 3: Parse error - Sai cú pháp query string

Nguyên nhân: Thiếu dấu nháy, thừa dấu phẩy, sai keyword.

// Sai: Thiếu dấu nháy đơn quanh text
=QUERY(A1:J, "SELECT * WHERE H = Hoàn thành", 1)

// Sửa: Thêm dấu nháy đơn
=QUERY(A1:J, "SELECT * WHERE H = 'Hoàn thành'", 1)

// Sai: Thừa dấu phẩy cuối SELECT
=QUERY(A1:J, "SELECT A, B, C,", 1)

// Sửa:
=QUERY(A1:J, "SELECT A, B, C", 1)

Lỗi 4: Header không đúng khi dùng GROUP BY

Nguyên nhân: SELECT có cột không nằm trong GROUP BY và không có hàm tổng hợp.

// Sai: Cột C không có trong GROUP BY, cũng không dùng hàm tổng hợp
=QUERY(A1:J, "SELECT J, C, SUM(G) GROUP BY J", 1)

// Sửa: Thêm C vào GROUP BY
=QUERY(A1:J, "SELECT J, C, SUM(G) GROUP BY J, C", 1)

// Hoặc: Bỏ C ra khỏi SELECT
=QUERY(A1:J, "SELECT J, SUM(G) GROUP BY J", 1)

Lỗi 5: Col1, Col2 vs A, B khi dùng IMPORTRANGE

Nguyên nhân: Khi data là kết quả của hàm khác (IMPORTRANGE, ARRAYFORMULA, {}), phải dùng Col1, Col2... thay vì A, B...

// Sai: Dùng A, B với IMPORTRANGE
=QUERY(IMPORTRANGE(url, "A:J"), "SELECT A, B", 1)

// Sửa: Dùng Col1, Col2
=QUERY(IMPORTRANGE(url, "A:J"), "SELECT Col1, Col2", 1)

Lỗi 6: Ngày tháng không lọc đúng

Nguyên nhân: Không dùng đúng cú pháp date trong query.

// Sai: Dùng text thay vì date literal
=QUERY(A1:J, "SELECT * WHERE B > '2026-01-01'", 1)

// Sửa: Dùng date keyword
=QUERY(A1:J, "SELECT * WHERE B > date '2026-01-01'", 1)

// Tham chiếu ô ngày:
=QUERY(A1:J, "SELECT * WHERE B > date '"&TEXT(M1,"yyyy-MM-dd")&"'", 1)

Lỗi 7: Kết quả sai khi cột có dữ liệu hỗn hợp (Mixed types)

Nguyên nhân: QUERY tự động phát hiện kiểu dữ liệu của cột dựa trên majority. Nếu 60% là số và 40% là text, cột sẽ được coi là số, các ô text sẽ bị bỏ qua.

// Khắc phục: Đảm bảo cột dữ liệu đồng nhất
// Nếu cần: chuyển toàn bộ về text bằng ARRAYFORMULA
=QUERY(
  ARRAYFORMULA({A1:A, TO_TEXT(B1:B), C1:G}),
  "SELECT Col1, Col2 WHERE Col2 is not null",
  1
)

Tips Nâng Cao Cho Power Users

Tip 1: Dùng Named Range

Thay vì A1:J, tạo Named Range (Data > Named ranges) đặt tên "DonHang" cho phạm vi. Công thức sẽ dễ đọc hơn:

=QUERY(DonHang, "SELECT A, G", 1)

Tip 2: Viết query nhiều dòng

Dùng ký tự nối & để chia query dài thành nhiều phần cho dễ đọc:

=QUERY(A1:J,
  "SELECT J, SUM(G) "&
  "WHERE H = 'Hoàn thành' "&
  "GROUP BY J "&
  "ORDER BY SUM(G) DESC"
, 1)

Tip 3: Dashboard động

Dùng Data Validation tạo dropdown, kết hợp với QUERY tham chiếu ô để tạo báo cáo thay đổi theo lựa chọn.

Tip 4: Hiệu suất

Giới hạn phạm vi data (dùng A1:J500 thay vì A:J) sẽ nhanh hơn đáng kể khi bảng lớn. Tránh QUERY lồng nhiều cấp.

Ví dụ 35: Dashboard tổng hợp hoàn chỉnh

// === SHEET: Dashboard ===
// M1 = Dropdown: Tháng (1-12)
// M2 = Dropdown: Khu vực (Tất cả, HCM, HN, DN)
// M3 = Dropdown: Trạng thái (Tất cả, Hoàn thành, Đang giao, Đã hủy)

// --- Ô KPI ---
// Tổng doanh thu (P1):
=QUERY(DonHang!A1:J,
  "SELECT SUM(G)
   WHERE month(B)+1 = "&M1&
  IF(M2="Tất cả","", " AND J = '"&M2&"'")&
  IF(M3="Tất cả","", " AND H = '"&M3&"'")&
  " LABEL SUM(G) ''
   FORMAT SUM(G) '#,##0'"
, 1)

// --- Bảng chi tiết (P5:T) ---
=QUERY(DonHang!A1:J,
  "SELECT A, B, C, D, G
   WHERE month(B)+1 = "&M1&
  IF(M2="Tất cả","", " AND J = '"&M2&"'")&
  IF(M3="Tất cả","", " AND H = '"&M3&"'")&
  " ORDER BY G DESC
   FORMAT B 'dd/MM/yyyy', G '#,##0'"
, 1)

QUERY vs FILTER vs VLOOKUP - Khi Nào Dùng Hàm Nào?

Tiêu chí QUERY FILTER VLOOKUP
Lọc dữ liệuMạnh (WHERE + regex)Tốt (nhiều điều kiện)Cơ bản (1 giá trị)
Sắp xếpCó (ORDER BY)Cần SORT bổ sungKhông
Nhóm & tổng hợpCó (GROUP BY)KhôngKhông
Pivot tableCó (PIVOT)KhôngKhông
Phân trangCó (LIMIT/OFFSET)KhôngKhông
Tốc độ (dữ liệu lớn)NhanhNhanhChậm hơn
Dễ họcTrung bình (cần biết SQL)DễRất dễ
Khi nào dùng?Báo cáo phức tạp, nhóm, pivotLọc đơn giản-trung bìnhTra cứu 1 giá trị

Quy tắc chọn hàm:

  • Tra cứu 1 giá trị -> VLOOKUP hoặc INDEX/MATCH
  • Lọc nhiều dòng, 1-2 điều kiện -> FILTER
  • Lọc + sắp xếp + giới hạn -> QUERY
  • Nhóm, tổng hợp, pivot, báo cáo -> QUERY (không thể thay thế)

QUERY Cheat Sheet - Tổng Hợp Cú Pháp

=QUERY(data,
  "SELECT col1, col2, AGG(col3)     -- Chọn cột & hàm tổng hợp
   WHERE condition                   -- Lọc điều kiện
   GROUP BY col1, col2               -- Nhóm dữ liệu
   PIVOT col4                        -- Xoay bảng
   ORDER BY col1 ASC/DESC            -- Sắp xếp
   LIMIT n                           -- Giới hạn số dòng
   OFFSET n                          -- Bỏ qua n dòng đầu
   LABEL col1 'Tên Mới'             -- Đổi tên header
   FORMAT col1 'pattern'             -- Định dạng hiển thị"
, headers)

-- Toán tử WHERE:
-- =, !=, <, >, <=, >=
-- contains, starts with, ends with, matches
-- is null, is not null
-- AND, OR, NOT

-- Hàm tổng hợp (dùng với GROUP BY):
-- SUM(), COUNT(), AVG(), MAX(), MIN()

-- Hàm ngày:
-- year(), month(), day(), quarter()
-- dayOfWeek(), hour(), minute(), second()
-- toDate(), now()

-- Date literal: date '2026-01-15'
-- DateTime literal: datetime '2026-01-15 10:30:00'
-- Timestamp literal: timestamp '2026-01-15 10:30:00'

Kết Luận

Hàm QUERY là công cụ mạnh mẽ nhất trong Google Sheets, cho phép bạn thực hiện các truy vấn dữ liệu phức tạp chỉ với một công thức duy nhất. Từ việc lọc, sắp xếp đơn giản đến nhóm dữ liệu, tạo pivot table và xây dựng dashboard tự động - tất cả đều có thể làm được với QUERY.

Tóm tắt nội dung bài viết:

  • Cú pháp: =QUERY(data, query, headers) - 3 tham số, query viết giống SQL
  • SELECT: Chọn cột, tính toán trong SELECT, dùng * cho tất cả
  • WHERE: 12 toán tử lọc (=, !=, contains, matches, is null...) + AND/OR
  • ORDER BY: Sắp xếp ASC/DESC, hỗ trợ nhiều cột
  • GROUP BY: Nhóm + 5 hàm tổng hợp (SUM, COUNT, AVG, MAX, MIN)
  • PIVOT: Tạo bảng xoay, biến giá trị thành header cột
  • LIMIT/OFFSET: Phân trang, top N kết quả
  • LABEL/FORMAT: Đổi tên cột, định dạng số/ngày cho báo cáo
  • 35+ ví dụ thực tế: Bán hàng, kho, nhân sự, tài chính, dashboard
  • Kết hợp: IMPORTRANGE, ARRAYFORMULA, QUERY lồng QUERY
  • 7 lỗi thường gặp: Mixed types, sai cú pháp date, Col1 vs A

Lời khuyên: Hãy bắt đầu với những ví dụ đơn giản (SELECT + WHERE), sau đó dần thêm ORDER BY, GROUP BY. Khi đã quen, bạn sẽ thấy QUERY trở thành công cụ không thể thiếu trong mọi bảng tính.

Thực Hành Ngay Với SheetStore!

Nền tảng Google Sheets chuyên nghiệp với template sẵn dùng QUERY cho quản lý bán hàng, kho hàng, nhân sự. Dùng thử miễn phí tại sheet.com.vn

Khám Phá Ngay

Câu Hỏi Thường Gặp (FAQ)

1. Hàm QUERY có giới hạn bao nhiêu dòng dữ liệu?

Google Sheets có giới hạn 10 triệu ô (cells) cho mỗi spreadsheet. Hàm QUERY không có giới hạn riêng, nhưng hiệu suất sẽ giảm đáng kể khi xử lý trên 50.000 dòng. Với dữ liệu trên 100.000 dòng, nên cân nhắc dùng Google BigQuery hoặc Apps Script để xử lý.

2. QUERY trong Google Sheets khác gì SQL thật?

QUERY trong Google Sheets sử dụng Google Visualization API Query Language, tương tự nhưng không hoàn toàn giống SQL. Những khác biệt chính:

  • Không có JOIN - phải dùng IMPORTRANGE hoặc {} để nối data trước
  • Không có subquery trong WHERE (phải dùng QUERY lồng QUERY)
  • Không có HAVING - lọc sau GROUP BY phải dùng QUERY lồng
  • Không có INSERT, UPDATE, DELETE - chỉ đọc dữ liệu
  • Cột tham chiếu bằng chữ cái (A, B) thay vì tên cột

3. Làm sao dùng QUERY với tiếng Việt có dấu?

QUERY hỗ trợ Unicode đầy đủ, bao gồm tiếng Việt. Bạn có thể dùng trực tiếp: WHERE H = 'Hoàn thành', WHERE C contains 'Nguyễn'. Lưu ý: toán tử contains phân biệt hoa/thường nên 'hoàn thành' khác 'Hoàn thành'. Dùng lower() để không phân biệt: WHERE lower(H) = 'hoàn thành'.

4. Tại sao QUERY trả về #N/A khi không có kết quả?

Khi không có dòng nào thỏa mãn điều kiện WHERE, QUERY trả về #N/A (nếu có header) hoặc lỗi. Để xử lý, bọc trong IFERROR:

=IFERROR(QUERY(A1:J, "SELECT * WHERE G > 999999999", 1), "Không có kết quả")

5. Có thể dùng QUERY trong Google Sheets mobile không?

Có. Hàm QUERY hoạt động bình thường trên Google Sheets mobile (Android và iOS). Tuy nhiên, việc nhập công thức dài trên mobile khá khó khăn. Khuyên bạn nên viết QUERY trên desktop rồi xem kết quả trên mobile. Kết quả sẽ tự động cập nhật real-time giống desktop.

6. QUERY có hoạt động trên Microsoft Excel không?

Không. Hàm QUERY là độc quyền của Google Sheets, không có trong Microsoft Excel. Trong Excel, bạn có thể dùng Power Query (Get & Transform) để đạt kết quả tương tự nhưng với giao diện khác hoàn toàn. Ngoài ra, Excel 365 có hàm FILTER, SORT, UNIQUE, LAMBDA có thể thay thế phần nào chức năng của QUERY.

Chia sẻ bài viết:

Tuân Hoang

Tuân Hoang

Đội ngũ SheetStore

Bạn thấy bài viết hữu ích?

Đăng ký nhận thông báo khi có bài viết mới.

Nhận thông báo khi có bài viết mới. Không spam, hứa luôn! 😊

Bình luận (0)

Vui lòng đăng nhập để tham gia thảo luận