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 |
|---|---|---|---|---|---|---|---|---|---|
| DH001 | 2026-01-05 | Nguyễn Văn A | Laptop Dell | 2 | 15000000 | 30000000 | Hoàn thành | Trần Thị B | HCM |
| DH002 | 2026-01-08 | Lê Văn C | iPhone 16 | 5 | 25000000 | 125000000 | Hoàn thành | Phạm Văn D | HN |
| DH003 | 2026-01-12 | Hoàng Thị E | MacBook Pro | 1 | 45000000 | 45000000 | Đang giao | Trần Thị B | DN |
| DH004 | 2026-01-15 | Võ Văn F | Samsung S25 | 3 | 22000000 | 66000000 | Hoàn thành | Ngô Thị G | HCM |
| DH005 | 2026-02-01 | Đỗ Văn H | iPad Pro | 4 | 28000000 | 112000000 | Đã hủy | Phạm Văn D | HN |
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ả |
|---|---|---|
| data | Có | Phạm vi dữ liệu cần truy vấn (VD: A1:J100 hoặc DonHang!A:J) |
| query | Có | Chuỗi truy vấn viết bằng Google Visualization API Query Language (giống SQL) |
| headers | Không | Số 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
databắ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ằng | WHERE H = 'Hoàn thành' |
| != | Không bằng | WHERE H != 'Đã hủy' |
| > | Lớn hơn | WHERE G > 50000000 |
| < | Nhỏ hơn | WHERE E < 3 |
| >= | Lớn hơn hoặc bằng | WHERE G >= 100000000 |
| <= | Nhỏ hơn hoặc bằng | WHERE F <= 25000000 |
| contains | Chứa chuỗi | WHERE D contains 'Mac' |
| starts with | Bắt đầu bằng | WHERE C starts with 'Nguyễn' |
| ends with | Kết thúc bằng | WHERE A ends with '05' |
| matches | Khớp regex | WHERE A matches 'DH00[1-5]' |
| is null | Giá trị rỗng | WHERE H is null |
| is not null | Không rỗng | WHERE 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ổng | SUM(G) |
| COUNT(col) | Đếm | COUNT(A) |
| AVG(col) | Trung bình | AVG(G) |
| MAX(col) | Giá trị lớn nhất | MAX(G) |
| MIN(col) | Giá trị nhỏ nhất | MIN(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ândd/MM/yyyy- Ngày dạng 25/02/2026yyyy-MM-dd- Ngày dạng ISO 2026-02-25MM/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ệu | Mạnh (WHERE + regex) | Tốt (nhiều điều kiện) | Cơ bản (1 giá trị) |
| Sắp xếp | Có (ORDER BY) | Cần SORT bổ sung | Không |
| Nhóm & tổng hợp | Có (GROUP BY) | Không | Không |
| Pivot table | Có (PIVOT) | Không | Không |
| Phân trang | Có (LIMIT/OFFSET) | Không | Không |
| Tốc độ (dữ liệu lớn) | Nhanh | Nhanh | Chậm hơn |
| Dễ học | Trung 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, pivot | Lọc đơn giản-trung bình | Tra 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á NgayCâ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
Độ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.