Google Sheets hay Excel: so sánh thật cho người dùng văn phòng và chủ cửa hàng nhỏ
Google Sheets hay Excel: so chi phí, làm chung, dùng trên điện thoại, khi mất mạng, giới hạn dữ liệu, Apps Script với VBA và các công thức khác nhau.
Mẹo Google Sheets · 15 phút đọc
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.

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.
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ày | B: Khách | C: Nhân viên | D: Sản phẩm | E: Số lượng | F: Doanh thu | |
|---|---|---|---|---|---|---|
| 2 | 02/10/2026 | Cửa hàng Minh Anh | Lan | Cà phê hạt | 5 | 1.250.000 |
| 3 | 03/10/2026 | Quán Gió | Tuấn | Trà ô long | 3 | 540.000 |
| 4 | 05/10/2026 | Cửa hàng Minh Anh | Lan | Trà ô long | 2 | 360.000 |
| 5 | 08/10/2026 | Tạp hoá Bảy Hiền | Tuấn | Cà phê hạt | 8 | 2.000.000 |
| 6 | 12/10/2026 | Quán Gió | Lan | Cà phê hạt | 4 | 1.000.000 |
| 7 | 15/10/2026 | Tạp hoá Bảy Hiền | Hương | Mật ong | 6 | 900.000 |
| 8 | 18/10/2026 | Cửa hàng Minh Anh | Hương | Cà phê hạt | 2 | 500.000 |
| 9 | 28/09/2026 | Quán Gió | Tuấn | Mật ong | 1 | 150.000 |
=QUERY(dữ_liệu; truy_vấn; [tiêu_đề])| Đối số | Nghĩa | Ví dụ |
|---|---|---|
| dữ_liệu | Dải ô hoặc mảng cần hỏi | A1:F9, hoặc A1:F để tự lấy dòng mới |
| truy_vấn | Câ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án | 1 |
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.
=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.

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 where | Nghĩa | Ví dụ trên bảng mẫu |
|---|---|---|
| F >= 1000000 | So 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ường | 3 đơ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ường | 4 đơn cà phê |
| C = 'Lan' and F >= 1000000 | Cả hai điều kiện | Dòng 2 và 6 |
=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 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.
=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".
=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 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.
=QUERY(A1:F9; "select C, sum(F) group by C pivot D"; 1)| Nhân viên | Cà phê hạt | Mật ong | Trà ô long |
|---|---|---|---|
| Hương | 500.000 | 900.000 | |
| Lan | 2.250.000 | 360.000 | |
| Tuấn | 2.000.000 | 150.000 | 540.000 |
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.
Đâ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.
=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):
=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.
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.
=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.
=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:
=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))
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:
=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.
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ệu | Nguyên nhân | Cách sửa |
|---|---|---|
| Lỗi không phân tích được chuỗi truy vấn | Sai thứ tự mệnh đề, thiếu nháy, dùng ; giữa các cột trong select | Xếp lại theo thứ tự select › where › group by › pivot › order by › limit › label; dùng dấu phẩy |
| NO_COLUMN | Cột nằm ngoài dải ô, gõ chữ thường, hoặc lẫn Col1 với A | Mở 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_AGG | Cột trong select không gộp mà cũng không có trong group by | Thêm cột đó vào group by hoặc bọc sum/count |
| AVG_SUM_ONLY_NUMERIC | sum/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ệu | Lọc ngày bằng '01/10/2026', sai hoa thường, khoảng trắng thừa, ô lọc trống | date '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ả 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).
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.
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.
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.
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.
Mẫu khác liên quan: Bán hàng 360 PRO.
Google Sheets hay Excel: so chi phí, làm chung, dùng trên điện thoại, khi mất mạng, giới hạn dữ liệu, Apps Script với VBA và các công thức khác nhau.
Cách dùng hàm XLOOKUP trong Google Sheets: gõ mã khách ra tên, SĐT, hạng; tra sang trái, giá trị khi không thấy, khớp gần đúng, sửa lỗi #N/A.
Cách tạo biểu đồ trong Google Sheets: chọn loại cột, đường, tròn, kết hợp, cột chồng; trục phụ, đổi màu, nhãn, biểu đồ tự cập nhật, SPARKLINE và lỗi hay gặp.
Cách dùng hàm IMPORTRANGE trong Google Sheets: cú pháp, bấm Cho phép truy cập, kết hợp QUERY, FILTER, gộp file chi nhánh, sửa lỗi #REF!, giới hạn và bảo mật.
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)