hitava

Mẹo Google Sheets · 15 phút đọc

Cách dùng hàm QUERY trong Google Sheets: SELECT, WHERE, GROUP BY, lọc theo ngày và sửa lỗi

Hàm QUERY lấy một bảng dữ liệu và một câu lệnh dạng chữ, rồi trả về bảng mới đã lọc, gộp nhóm và sắp xếp: =QUERY(A1:F9; "select C, sum(F) group by C"; 1) cộng doanh thu theo từng nhân viên chỉ bằng một ô. Bài này đi qua cú pháp, từng mệnh đề select, where, group by, order by, limit, label, pivot, cách dùng Col1 khi dữ liệu là mảng ghép, lọc theo ngày, lọc theo ô người dùng gõ, và các lỗi hay gặp — mỗi công thức đều có ví dụ số và phần thử lại.

Đăng HiTaVaQUERYCông thứcBáo cáoGoogle Sheets
Công thức =QUERY(A1:F9; "select C, sum(F) group by C order by sum(F) desc label sum(F) 'Doanh thu'"; 1) biến bảng 8 đơn hàng thành bảng doanh thu theo nhân viên: Tuấn 2.690.000, Lan 2.610.000, Hương 1.400.000

Hàm QUERY là gì, khi nào nên dùng

QUERY là hàm riêng của Google Sheets, cho phép viết một câu lệnh gần giống SQL để hỏi bảng dữ liệu: "lấy những cột này, của những dòng thoả điều kiện kia, gộp theo cột này, sắp xếp theo cột nọ". Kết quả tự tràn ra thành một bảng mới và tự cập nhật khi dữ liệu gốc thay đổi.

Cú pháp
=QUERY(dữ_liệu; truy_vấn; tiêu_đề)
Chuỗi truy vấn
Viết trong ngoặc kép, từ khoá tiếng Anh, cách bằng dấu phẩy
Gọi cột
Chữ cột A, B, C… với dải ô; Col1, Col2… với mảng {…}
Ngày tháng
date 'yyyy-mm-dd', ghép bằng TEXT(ô; "yyyy-mm-dd")

Nên dùng QUERY khi bạn cần một bảng báo cáo từ bảng nhập liệu: doanh thu theo nhân viên, số đơn theo sản phẩm, top 3 đơn lớn nhất. Chỉ cần một con số thì SUMIFS ngắn hơn; chỉ cần lọc dòng thì FILTER cũng đủ.

Mọi ví dụ trong bài dùng chung bảng Đơn hàng dưới đây (A1:F9, dòng 1 là tiêu đề). Công thức viết theo vùng Việt Nam nên đối số của hàm cách nhau bằng dấu chấm phẩy.

A: NgàyB: KháchC: Nhân viênD: Sản phẩmE: Số lượngF: Doanh thu
202/10/2026Cửa hàng Minh AnhLanCà phê hạt51.250.000
303/10/2026Quán GióTuấnTrà ô long3540.000
405/10/2026Cửa hàng Minh AnhLanTrà ô long2360.000
508/10/2026Tạp hoá Bảy HiềnTuấnCà phê hạt82.000.000
612/10/2026Quán GióLanCà phê hạt41.000.000
715/10/2026Tạp hoá Bảy HiềnHươngMật ong6900.000
818/10/2026Cửa hàng Minh AnhHươngCà phê hạt2500.000
928/09/2026Quán GióTuấnMật ong1150.000
Bảng dữ liệu mẫu: 8 đơn, tổng doanh thu 6.700.000.

Cú pháp hàm QUERY trong Google Sheets

=QUERY(dữ_liệu; truy_vấn; [tiêu_đề])
Đối sốNghĩaVí dụ
dữ_liệuDải ô hoặc mảng cần hỏiA1:F9, hoặc A1:F để tự lấy dòng mới
truy_vấnCâu lệnh, đặt trong ngoặc kép. Chuỗi giá trị bên trong dùng nháy đơn"select B, F where C = 'Lan'"
tiêu_đềSố dòng tiêu đề ở đầu dữ liệu. Bỏ trống thì Google tự đoán1

Hai điều làm người mới hay vấp: chuỗi truy vấn luôn viết theo kiểu tiếng Anh dù file đặt vùng Việt Nam, tức các cột trong select cách nhau bằng dấu phẩy (select B, D, F) và số thập phân dùng dấu chấm (where F > 1.5). Dấu chấm phẩy chỉ dùng giữa các đối số của hàm. Thứ hai, chữ cột nên viết in hoa (A, B, C) như chúng hiện trên trang tính.

Lấy Khách, Sản phẩm, Doanh thu của các đơn do Lan bán.
=QUERY(A1:F9; "select B, D, F where C = 'Lan'"; 1)

Thử lại: cột C bằng Lan ở dòng 2, 4, 6. Kết quả là dòng tiêu đề (Khách, Sản phẩm, Doanh thu) và 3 dòng: Cửa hàng Minh Anh · Cà phê hạt · 1.250.000; Cửa hàng Minh Anh · Trà ô long · 360.000; Quán Gió · Cà phê hạt · 1.000.000. Đặt công thức ở chỗ trống đủ rộng, nếu không sẽ báo #REF! vì kết quả đè lên dữ liệu khác.

Bảng 9 mệnh đề đánh số theo thứ tự: select, where, group by, pivot, order by, limit, offset, label, format, mỗi mệnh đề có ví dụ như where C = 'Lan' and F >= 500000 và label sum(F) 'Doanh thu'
Các mệnh đề phải đứng đúng thứ tự này. Không cần mệnh đề nào thì bỏ.

SELECT và WHERE: chọn cột, lọc dòng

select liệt kê cột muốn lấy, theo đúng thứ tự muốn hiện. select * lấy tất cả. Bỏ hẳn select cũng là lấy tất cả. where giữ lại những dòng thoả điều kiện, ghép nhiều điều kiện bằng and, or, not.

Điều kiện trong whereNghĩaVí dụ trên bảng mẫu
F >= 1000000So sánh số: =, !=, <, >, <=, >= (số không có dấu chấm ngăn nghìn)3 đơn: 1.250.000, 2.000.000, 1.000.000
C = 'Tuấn'Bằng đúng chuỗi, phân biệt hoa thường3 đơn của Tuấn
B contains 'Minh Anh'Chứa đoạn chữDòng 2, 4, 8
lower(D) = 'cà phê hạt'Không phân biệt hoa thường4 đơn cà phê
C = 'Lan' and F >= 1000000Cả hai điều kiệnDòng 2 và 6
Các đơn từ 1 triệu trở lên, đơn lớn nhất lên đầu.
=QUERY(A1:F9; "select B, F where F >= 1000000 order by F desc"; 1)

Thử lại: F ≥ 1.000.000 ở dòng 2 (1.250.000), 5 (2.000.000), 6 (1.000.000). Sắp giảm dần: Tạp hoá Bảy Hiền 2.000.000; Cửa hàng Minh Anh 1.250.000; Quán Gió 1.000.000.

order by sắp xếp, thêm asc (tăng, mặc định) hoặc desc (giảm). limit cắt lấy N dòng đầu, rất tiện để làm bảng "top":

=QUERY(A1:F9; "select A, B, F order by F desc limit 3"; 1)

Thử lại: ba đơn lớn nhất là 08/10 Tạp hoá Bảy Hiền 2.000.000; 02/10 Cửa hàng Minh Anh 1.250.000; 12/10 Quán Gió 1.000.000.

GROUP BY và LABEL: cộng, đếm theo nhóm

group by gộp các dòng cùng giá trị thành một dòng, đi kèm hàm gộp: sum (cộng), count (đếm), avg (trung bình), max, min. Quy tắc bắt buộc: cột nào trong select mà không nằm trong hàm gộp thì phải có trong group by.

Doanh thu theo nhân viên, nhiều nhất lên đầu, tiêu đề cột đổi thành "Doanh thu".
=QUERY(A1:F9; "select C, sum(F) group by C order by sum(F) desc label sum(F) 'Doanh thu'"; 1)

Thử lại: Lan = 1.250.000 + 360.000 + 1.000.000 = 2.610.000; Tuấn = 540.000 + 2.000.000 + 150.000 = 2.690.000; Hương = 900.000 + 500.000 = 1.400.000. Cộng lại 6.700.000, đúng tổng bảng. Sắp giảm dần: Tuấn, Lan, Hương. Không có label thì tiêu đề cột hiện "sum Doanh thu".

Đếm số đơn và cộng số lượng theo sản phẩm. Nhiều label cách nhau bằng dấu phẩy.
=QUERY(A1:F9; "select D, count(B), sum(E) group by D label count(B) 'Số đơn', sum(E) 'Số lượng'"; 1)

Thử lại: Cà phê hạt có 4 đơn (dòng 2, 5, 6, 8), số lượng 5 + 8 + 4 + 2 = 19; Mật ong 2 đơn, 6 + 1 = 7; Trà ô long 2 đơn, 3 + 2 = 5. Khi không có order by, group by tự xếp nhóm theo thứ tự chữ cái.

PIVOT: biến giá trị thành cột

pivot lấy các giá trị khác nhau của một cột làm tiêu đề cột mới, giống bảng tổng hợp (pivot table) nhưng nằm trong một công thức.

Hàng là nhân viên, cột là sản phẩm, ô là doanh thu.
=QUERY(A1:F9; "select C, sum(F) group by C pivot D"; 1)
Nhân viênCà phê hạtMật ongTrà ô long
Hương500.000900.000
Lan2.250.000360.000
Tuấn2.000.000150.000540.000
Kết quả của công thức pivot. Ô trống là nhân viên đó không bán sản phẩm đó.

Thử lại: Lan bán cà phê ở dòng 2 và 6: 1.250.000 + 1.000.000 = 2.250.000; trà ở dòng 4: 360.000; không bán mật ong nên ô trống. Cột Tuấn cộng lại 2.690.000, khớp với ví dụ group by ở trên. Mỗi khi có sản phẩm mới, pivot tự thêm cột — nhớ chừa chỗ trống bên phải.

Lọc theo ngày trong QUERY

Đây là chỗ hỏi nhiều nhất. Trong chuỗi truy vấn, ngày phải viết dạng date 'yyyy-mm-dd', không phải 01/10/2026. Viết where A >= '01/10/2026' sẽ so ngày với một chuỗi chữ và ra kết quả rỗng hoặc lỗi.

Các đơn trong tháng 10/2026. Dùng "< ngày đầu tháng sau" thay cho "<= 31/10" để không sót đơn có giờ.
=QUERY(A1:F9; "select A, B, F where A >= date '2026-10-01' and A < date '2026-11-01'"; 1)

Thử lại: chỉ đơn ngày 28/09 (dòng 9) bị loại, còn 7 đơn tháng 10, tổng 6.550.000.

Thực tế bạn sẽ muốn gõ ngày vào ô rồi để công thức tự đổi. Lúc này phải nối chuỗi: đặt phần ngày ra ngoài ngoặc kép và dùng TEXT để đổi ngày thành đúng dạng yyyy-mm-dd. Giả sử H1 = 01/10/2026 (Từ ngày), H2 = 15/10/2026 (Đến ngày):

H2+1 để lấy trọn ngày 15/10. Để ý dãy ký tự '" và "' — nháy đơn của date nằm trong chuỗi, nháy kép đóng mở chuỗi.
=QUERY(A1:F9; "select C, sum(F) where A >= date '"&TEXT(H1;"yyyy-mm-dd")&"' and A < date '"&TEXT(H2+1;"yyyy-mm-dd")&"' group by C label sum(F) 'Doanh thu'"; 1)

Thử lại: công thức sau khi ghép thành ... where A >= date '2026-10-01' and A < date '2026-10-16' .... Các dòng 2–7 thoả (dòng 7 là 15/10 vẫn được tính), dòng 8 (18/10) và dòng 9 (28/09) bị loại. Kết quả: Hương 900.000; Lan 2.610.000; Tuấn 540.000 + 2.000.000 = 2.540.000.

Gộp theo tháng dùng hàm month() — nhưng month() đếm từ 0: tháng 1 là 0, tháng 10 là 9. Cộng thêm 1 cho dễ đọc:

=QUERY(A1:F9; "select month(A)+1, sum(F) where A is not null group by month(A)+1 label month(A)+1 'Tháng', sum(F) 'Doanh thu'"; 1)

Thử lại: tháng 9: 150.000; tháng 10: 6.550.000. Dữ liệu nhiều năm thì gộp thêm year(A).

Cột ngày là chữ thì QUERY không lọc được

Ngày dán từ phần mềm khác hay nằm dưới dạng chữ (sát trái ô). QUERY coi cả cột là chữ và date '...' không khớp dòng nào. Kiểm tra bằng =ISNUMBER(A2): ra FALSE là ngày dạng chữ. Cách đổi hàng loạt có ở bài sửa lỗi ngày tháng trong Google Sheets.

Lọc theo ô tham chiếu: nối chuỗi trong QUERY

Chuỗi truy vấn chỉ là chữ, nên Google không hiểu "H3" nằm bên trong nó. Muốn lọc theo ô người dùng gõ, bạn cắt chuỗi ra và nối giá trị ô vào bằng dấu &. Quy tắc: giá trị chữ phải nằm trong nháy đơn, số thì không.

H3 = Quán Gió: các đơn của khách này theo ngày.
=QUERY(A1:F9; "select A, D, F where B = '"&H3&"' order by A"; 1)

Thử lại: công thức ghép thành where B = 'Quán Gió'. Dòng 3, 6, 9 thoả; sắp theo ngày: 28/09/2026 · Mật ong · 150.000; 03/10/2026 · Trà ô long · 540.000; 12/10/2026 · Cà phê hạt · 1.000.000.

H4 = 1000000: lọc theo số, không có nháy đơn.
=QUERY(A1:F9; "select B, F where F >= "&H4&" order by F desc"; 1)

Thử lại: ra 3 đơn như ví dụ ở phần where.

Khi ô lọc trống, where B = '' không khớp dòng nào nên bảng chỉ còn tiêu đề. Muốn "trống thì lấy hết", bọc IF ở ngoài:

Kết hợp nhiều ô lọc tuỳ chọn thì xem thêm bài hàm IF nhiều điều kiện.
=IF(H3=""; QUERY(A1:F9; "select A, B, D, F order by A"; 1); QUERY(A1:F9; "select A, B, D, F where B = '"&H3&"' order by A"; 1))
Tab Nguồn & ROI của mẫu Quản lý Lead & Bán hàng PRO: chọn Kỳ Quý này và Nhân viên Tất cả, bảng 10 nguồn lead với cột Lead, Đủ ĐK, Thắng, Tỉ lệ chốt, Doanh số, Chi phí, CPL, CAC, ROAS, dòng tổng 180 lead, và hai biểu đồ chi phí, doanh số, tỉ lệ chốt theo nguồn
Bảng tổng hợp theo nguồn có ô chọn kỳ và nhân viên trong mẫu Quản lý Lead & Bán hàng PRO — cùng kiểu báo cáo "lọc theo ô, gộp theo nhóm" như các ví dụ ở trên.

Col1, Col2 khi dữ liệu là mảng hoặc ghép nhiều trang

Khi đối số dữ_liệu là một mảng chứ không phải dải ô thường — ghép bằng ngoặc nhọn {…}, kết quả của IMPORTRANGE, hay của một hàm khác — QUERY không còn biết cột A, B là gì. Lúc đó phải gọi cột theo vị trí: Col1, Col2, Col3… (chữ C in hoa, số không có khoảng cách).

Ví dụ phổ biến: đơn tháng 9 nằm ở trang T9, tháng 10 ở trang T10, cùng cấu trúc A:F. Ghép chồng hai trang bằng dấu chấm phẩy rồi gộp:

Lấy từ dòng 2 (bỏ tiêu đề từng trang) nên đối số cuối là 0. where Col1 is not null bỏ hàng nghìn dòng trống của dải mở A2:F.
=QUERY({'T9'!A2:F; 'T10'!A2:F}; "select Col3, sum(Col6) where Col1 is not null group by Col3 label Col3 'Nhân viên', sum(Col6) 'Doanh thu'"; 0)

Thử lại: T9 có đơn 28/09 của Tuấn 150.000, T10 có 7 đơn còn lại. Kết quả giống hệt bảng group by ở trên: Hương 1.400.000; Lan 2.610.000; Tuấn 2.690.000. Thiếu where Col1 is not null thì có thêm một dòng nhóm trống ở đầu.

Trong mảng của vùng Việt Nam, dấu chấm phẩy xếp chồng theo hàng, dấu gạch chéo ngược \ ghép cạnh nhau theo cột (vùng Hoa Kỳ dùng dấu phẩy). Ví dụ chỉ lấy cột Khách và Doanh thu nằm cách xa nhau:

=QUERY({A2:A9\F2:F9}; "select Col1, Col2 where Col2 >= 1000000"; 0)

Thử lại: mảng mới có 2 cột: Col1 là Ngày (cột A), Col2 là Doanh thu (cột F). Ra 3 dòng: 02/10 · 1.250.000; 08/10 · 2.000.000; 12/10 · 1.000.000. Dùng chữ cột A, F với mảng sẽ báo lỗi NO_COLUMN; ngược lại dùng Col1 với dải ô thường cũng báo lỗi.

Lỗi hay gặp khi dùng QUERY và cách sửa

1. Cột có kiểu dữ liệu trộn lẫn. QUERY chỉ cho mỗi cột một kiểu: số, chữ, ngày hoặc đúng/sai, và chọn kiểu chiếm đa số. Giá trị thuộc kiểu thiểu số bị coi là trống. Ví dụ cột Mã đơn có 1001, 1002, 1003, 1005 (số) và HD-1004 (chữ): kết quả QUERY hiện ô trống ở chỗ HD-1004, lọc where G = 'HD-1004' không ra gì, mà không có báo lỗi nào.

Cách sửa: thống nhất cả cột về một kiểu. Với cột mã, đổi định dạng cột sang văn bản thuần rồi nhập lại; hoặc ép cả cột thành chữ ngay trong công thức bằng TO_TEXT:

=QUERY({ARRAYFORMULA(TO_TEXT(G2:G9))\F2:F9}; "select Col1, Col2 where Col1 = 'HD-1004'"; 0)

Cột số mà lẫn vài ô số dạng chữ cũng gây sai tổng theo cách tương tự; cách nhận ra có ở bài sửa lỗi SUM bằng 0 trong Google Sheets.

2. Dấu nháy. Toàn bộ truy vấn nằm trong nháy kép, giá trị chữ bên trong dùng nháy đơn. Thiếu một nháy hoặc quên & khi nối ô là lỗi phân tích cú pháp. Mẹo kiểm tra: đặt riêng phần chuỗi vào một ô, ví dụ ="select A where B = '"&H3&"'", xem chuỗi ghép ra có đúng không rồi mới đưa vào QUERY.

3. Đối số tiêu_đề. Bỏ trống thì Google tự đoán số dòng tiêu đề, và có lúc đoán sai: dòng tiêu đề bị coi là dữ liệu, hoặc vài dòng đầu bị gộp thành một tiêu đề dài. Luôn ghi rõ: 1 khi dải ô có một dòng tiêu đề, 0 khi bắt đầu từ dòng dữ liệu.

Dấu hiệuNguyên nhânCách sửa
Lỗi không phân tích được chuỗi truy vấnSai thứ tự mệnh đề, thiếu nháy, dùng ; giữa các cột trong selectXếp lại theo thứ tự select › where › group by › pivot › order by › limit › label; dùng dấu phẩy
NO_COLUMNCột nằm ngoài dải ô, gõ chữ thường, hoặc lẫn Col1 với AMở rộng dải; chữ in hoa; mảng dùng Col1, dải thường dùng A
ADD_COL_TO_GROUP_BY_OR_AGGCột trong select không gộp mà cũng không có trong group byThêm cột đó vào group by hoặc bọc sum/count
AVG_SUM_ONLY_NUMERICsum/avg trên cột bị coi là chữĐổi số dạng chữ thành số
Chỉ ra dòng tiêu đề, không có dữ liệuLọc ngày bằng '01/10/2026', sai hoa thường, khoảng trắng thừa, ô lọc trốngdate 'yyyy-mm-dd'; lower(); TRIM dữ liệu; bọc IF

Excel không có hàm QUERY

QUERY chỉ có trên Google Sheets. Tải file về .xlsx rồi mở bằng Excel, các ô QUERY sẽ báo lỗi khi tính lại hoặc chỉ còn giá trị cũ. File phải dùng cả hai bên thì làm báo cáo bằng SUMIFS, COUNTIFS hoặc pivot table. Những khác biệt khác có ở bài Google Sheets hay Excel.

Báo cáo cho người khác xem thì khoá ô công thức để không ai gõ đè vùng kết quả.

Đọc tiếp

Câu hỏi thường gặp

Trong QUERY dùng dấu phẩy hay chấm phẩy?

Cả hai, ở hai chỗ khác nhau. Giữa các đối số của hàm (dữ liệu; truy vấn; tiêu đề) dùng dấu chấm phẩy theo vùng Việt Nam. Bên trong chuỗi truy vấn luôn dùng dấu phẩy: select A, B, sum(F).

QUERY lấy dữ liệu từ trang tính khác hoặc file khác được không?

Trang khác trong cùng file: ghi tên trang trước dải ô, ví dụ =QUERY('Đơn hàng'!A1:F; "select ..."; 1). File khác: dùng IMPORTRANGE làm đối số dữ liệu, khi đó phải gọi cột bằng Col1, Col2. Lần đầu cần bấm cho phép truy cập.

Làm sao để QUERY tự lấy dòng mới thêm vào?

Dùng dải mở như A1:F thay cho A1:F9 và thêm where A is not null (hoặc Col1 is not null) để bỏ dòng trống. Dòng mới nhập là báo cáo tự cập nhật.

Tìm kiếm trong QUERY có phân biệt chữ hoa, chữ thường không?

Có. where C = 'lan' không khớp 'Lan'. Dùng lower(C) = 'lan' hoặc lower(B) contains 'minh anh' để bỏ qua hoa thường.

Nên dùng QUERY, FILTER hay SUMIFS?

Cần một con số: SUMIFS, COUNTIFS. Cần lọc dòng giữ nguyên cột: FILTER. Cần lọc kèm gộp nhóm, sắp xếp, đổi tiêu đề, xoay cột: QUERY. File còn phải mở bằng Excel thì tránh QUERY.

Nguồn tham khảo

Mẫu làm sẵn cho việc này

Mẫu khác liên quan: Bán hàng 360 PRO.

Đọc tiếp

Xem thêm mẹo và video hướng dẫn trên kênh YouTube HiTaVa, hoặc đọc các bài khác trong chủ đề Mẹo Google Sheets.

Cần hỏi thêm?Zalo 0935077673 (Hải Vân)