Trong kỷ nguyên số hóa và quản trị dựa trên dữ liệu (data-driven), Power BI đã trở thành một trong những công cụ Business Intelligence hàng đầu thế giới. Để xây dựng các báo cáo động, trực quan và có giá trị dự báo cao, việc hiểu và áp dụng chính xác các hàm Aggregation là điều bắt buộc đối với mọi Data Analyst.
Bài viết này sẽ cung cấp cho bạn cái nhìn chuyên sâu nhất về các hàm Aggregation trong Power BI, cú pháp DAX chi tiết, cách phân biệt các hàm dễ nhầm lẫn, kèm theo các ví dụ thực tế được chụp trực tiếp từ dự án phân tích dữ liệu thực tế.
Các hàm Aggregation trong Power BI là gì?
Về bản chất, dữ liệu gốc trong các hệ thống ERP, CRM hay database thường được lưu trữ dưới dạng các giao dịch chi tiết – tức là mỗi dòng đại diện cho một sự kiện. Tuy nhiên, nhà quản trị không đưa ra quyết định dựa trên từng giao dịch đơn lẻ, họ cần những con số tổng hợp như: Tổng doanh thu tháng này là bao nhiêu? Giá trị đơn hàng trung bình tăng hay giảm? …
Aggregation trong Power BI là quá trình thu thập một tập hợp các giá trị từ nhiều dòng dữ liệu, thực hiện một phép toán số học trên đó và trả về một giá trị đơn lẻ đại diện cho tập hợp đó. Trong ngôn ngữ DAX, các hàm Aggregation hoạt động cực kỳ linh hoạt dưới sự chi phối của Filter Context . Dưới đây là chi tiết các hàm Aggregation cốt lõi:
Hàm SUM
Hàm SUM dùng để tính tổng tất cả các số trong một cột cụ thể.
Cú pháp:
SUM(<Cột>)
- <Cột>: Cột chứa các giá trị số mà bạn muốn tính tổng. Hàm không chấp nhận biểu thức phức tạp hoặc nhiều cột; nếu muốn tính toán trên biểu thức, bạn phải dùng hàm lặp SUMX.
- Nguyên lý hoạt động: Hàm SUM duyệt qua toàn bộ các dòng của cột được chỉ định (đã được lọc bởi Filter Context hiện tại), bỏ qua các giá trị trống (BLANK) và cộng dồn tất cả các giá trị số lại với nhau.
Hàm COUNT
Hàm COUNT dùng để đếm số lượng dòng trong một cột có chứa các giá trị không trống (non-blank values).
Cú pháp:
COUNT(<Cột>)
- <Cột>: Cột chứa các giá trị cần đếm. Cột này có thể chứa bất kỳ kiểu dữ liệu nào (Số, Văn bản, Ngày tháng).
- Nguyên lý hoạt động: Hàm sẽ đếm tất cả các ô có chứa dữ liệu số, chuỗi ký tự hoặc ngày tháng trong cột. Hàm hoàn toàn bỏ qua các giá trị trống (BLANK). Nếu không tìm thấy dòng nào thỏa mãn, hàm trả về giá trị trống (BLANK).
Hàm DISTINCTCOUNT
Hàm DISTINCTCOUNT dùng để đếm số lượng các giá trị duy nhất (không trùng lặp) trong một cột.
Cú pháp:
DISTINCTCOUNT(<Cột>)
- <Cột>: Cột chứa các giá trị muốn đếm trùng lặp.
- Nguyên lý hoạt động: Khác với hàm COUNT thông thường, DISTINCTCOUNT sẽ quét qua cột dữ liệu, loại bỏ toàn bộ các bản ghi trùng lặp và chỉ giữ lại danh sách các giá trị độc nhất để đếm. Điểm đặc biệt của DISTINCTCOUNT là nó sẽ đếm cả giá trị trống (BLANK) nếu trong cột đó xuất hiện ô trống (được coi là một giá trị độc nhất).
Hàm AVERAGE
Hàm AVERAGE dùng để tính trung bình cộng (arithmetic mean) của tất cả các giá trị số trong một cột.
Cú pháp:
AVERAGE(<Cột>)
- <Cột>: Cột chứa các giá trị số cần tính trung bình.
- Nguyên lý hoạt động: Hàm thực hiện phép toán:
$$Average = \frac{\sum_{i=1}^{n} x_i}{n}$$
Trong đó tử số là tổng các giá trị không trống (tương đương phép toán SUM), và mẫu số $n$ là số lượng các dòng chứa dữ liệu số (tương đương phép toán COUNT). Hàm bỏ qua các giá trị trống (BLANK) và các giá trị không phải dạng số (non-numeric).
Hàm MIN
Hàm MIN dùng để tìm giá trị nhỏ nhất trong một cột hoặc so sánh hai biểu thức vô hướng để trả về giá trị nhỏ nhất.
Cú pháp:
MIN(<Cột>)
(Hoặc so sánh hai biểu thức: MIN(<Biểu thức 1>, <Biểu thức 2>))
- <Cột>: Cột chứa dữ liệu (Số, Ngày tháng, Văn bản) mà bạn muốn tìm giá trị nhỏ nhất.
- Nguyên lý hoạt động: Đối với kiểu dữ liệu số, hàm trả về số nhỏ nhất. Đối với kiểu Ngày tháng, hàm trả về ngày xa nhất trong quá khứ. Đối với kiểu Văn bản, hàm trả về giá trị đứng đầu tiên theo thứ tự bảng chữ cái alphabet. Các giá trị trống (BLANK) bị bỏ qua.
Hàm MAX
Hàm MAX dùng để tìm giá trị lớn nhất trong một cột hoặc so sánh hai biểu thức vô hướng để trả về giá trị lớn nhất.
Cú pháp:
MAX(<Cột>)
(Hoặc so sánh hai biểu thức: MAX(<Biểu thức 1>, <Biểu thức 2>))
- <Cột>: Cột chứa dữ liệu mà bạn muốn tìm giá trị lớn nhất.
- Nguyên lý hoạt động: Ngược lại với hàm MIN. Đối với kiểu số, hàm trả về số lớn nhất. Đối với Ngày tháng, hàm trả về ngày gần nhất với hiện tại. Đối với Văn bản, hàm trả về giá trị đứng cuối cùng theo thứ tự bảng chữ cái. Các giá trị trống (BLANK) bị bỏ qua.
Khi nào dùng COUNT và khi nào dùng SUM?
Một trong những sai lầm phổ biến nhất của người mới học Power BI khi dùng các hàm Aggregation trong Power BI là nhầm lẫn giữa mục đích sử dụng của hàm COUNT và hàm SUM. Dưới đây là bảng so sánh tư duy giúp bạn định hình chính xác ngữ cảnh sử dụng:
| Đặc tính so sánh | Hàm SUM | Hàm COUNT / DISTINCTCOUNT |
| Bản chất câu hỏi | “Tổng lượng là bao nhiêu?” (How much / How many in total) | “Có bao nhiêu đối tượng/sự kiện?” (How many items / occurrences) |
| Kiểu dữ liệu áp dụng | Chỉ áp dụng được trên cột định lượng (Numeric) chứa các con số có thể cộng dồn (Doanh thu, Chi phí, Số lượng sản phẩm). | Áp dụng trên mọi kiểu dữ liệu (Numeric, Text, Date, ID). |
| Ví dụ điển hình | Tính tổng doanh thu phát sinh, tổng số lít xăng đã tiêu thụ, tổng khối lượng hàng hóa vận chuyển. | Đếm số lượng hóa đơn phát sinh, đếm số khách hàng ghé thăm, đếm số ngày có giao dịch. |
| Hệ quả của sự nhầm lẫn | Nếu bạn SUM cột CustomerID (Mã khách hàng dạng số), bạn sẽ nhận được một con số vô nghĩa. | Nếu bạn COUNT cột Revenue (Doanh thu), bạn chỉ biết được số lượng đơn hàng bán ra chứ không biết tổng giá trị tiền thu về. |
Ví dụ cụ thể từng bước khởi tạo và viết DAX Measure
Trong phần này, chúng ta sẽ đi sâu vào thực tế thiết kế báo cáo Power BI thông qua các ví dụ cụ thể.
Để quản lý báo cáo một cách chuyên nghiệp và chuẩn hóa, các lập trình viên BI thường tạo riêng một bảng chứa các Measure (ở đây đặt tên là #MEASURE). Cách làm này giúp tách biệt hoàn toàn công thức tính toán khỏi các bảng dữ liệu vật lý, giúp cấu trúc file gọn gàng và dễ bảo trì.
Dưới đây là phân tích chi tiết 7 Measures cốt lõi được xây dựng trong dự án thực tế thông qua các ảnh chụp màn hình:
Tổng doanh thu (Total Sales)
Mã DAX:
Total Sales = SUM(OrderLine[LineRevenue$])

- Bối cảnh: Công ty cần tính tổng số tiền thu về từ tất cả các dòng sản phẩm được bán ra. Cột LineRevenue$ nằm trong bảng dữ liệu chi tiết đơn hàng OrderLine chứa thông tin doanh thu của từng dòng sản phẩm.
- Khi đặt Measure này lên một bảng trực quan, Power BI sẽ lọc bảng OrderLine theo tháng tương ứng, sau đó cộng tổng toàn bộ các giá trị trong cột LineRevenue$ để cho ra con số doanh thu chính xác của tháng đó.
Thống kê số lượng đơn hàng duy nhất (Total Orders)
Mã DAX:
Total Orders = DISTINCTCOUNT(OrderLine[OrderID])

- Bối cảnh: Một đơn hàng (đại diện bởi một OrderID duy nhất) có thể chứa nhiều dòng sản phẩm khác nhau. Do đó, trong bảng OrderLine, một OrderID sẽ xuất hiện lặp đi lặp lại nhiều lần. Nếu sử dụng hàm COUNT, chúng ta sẽ vô tình đếm tổng số dòng sản phẩm chứ không phải số đơn hàng thực tế.
- Hàm DISTINCTCOUNT tiến hành gom nhóm và loại bỏ tất cả các giá trị OrderID trùng lặp, chỉ đếm các giá trị duy nhất. Nhờ đó, nhà quản trị nắm được chính xác số lượng đơn hàng thực tế đã được chốt thành công.
Thống kê tổng số lượng sản phẩm (Total Quantity)
Mã DAX:
Total Quantity = SUM(OrderLine[Qty])

- Bối cảnh: Cột Qty (Quantity) trong bảng OrderLine ghi nhận số lượng sản phẩm của từng dòng đơn hàng.
- Việc cộng dồn toàn bộ cột Qty bằng hàm SUM giúp doanh nghiệp biết được tổng quy mô sản phẩm vật lý đã xuất kho để phục vụ cho các báo cáo logistics và quản lý chuỗi cung ứng.
Chi phí vận chuyển trung bình (AVG Shipping Cost)
Mã DAX:
AVG Shipping Cost = AVERAGE(Fulfillment[ShipCost$])

- Bối cảnh: Bảng Fulfillment quản lý các tác vụ đóng gói và giao hàng, cột ShipCost$ lưu trữ chi phí vận chuyển của từng đợt gửi hàng.
- Measure này giúp doanh nghiệp giám sát hiệu quả chi phí vận chuyển trung bình trên mỗi đơn giao hàng. Giá trị này cực kỳ quan trọng để đánh giá hiệu suất của các đối tác 3PL (Third-party logistics) hoặc tối ưu hóa chính sách freeship cho khách hàng.
Giá trị đơn hàng nhỏ nhất (Min Order Value)
Mã DAX:
Min Order Value = MIN(OrderLine[LineRevenue$])

- Bối cảnh: Phân tích dải phân phối doanh thu của các mặt hàng trong đơn hàng.
- Hàm MIN quét toàn bộ cột doanh thu chi tiết LineRevenue$ trong bối cảnh lọc hiện tại để tìm ra dòng sản phẩm có doanh thu thấp nhất. Đây là dữ liệu đầu vào hữu ích cho việc tối ưu giá bán tối thiểu hoặc xác định các sản phẩm bán kèm (cross-sell) giá trị thấp.
Giá trị đơn hàng lớn nhất (Max Order Value)
Mã DAX:
Max Order Value = MAX(OrderLine[LineRevenue$])

- Bối cảnh: Cần xác định giao dịch có giá trị đột biến lớn nhất trong tệp dữ liệu.
- Hàm MAX tìm kiếm giá trị doanh thu lớn nhất của một dòng sản phẩm đơn lẻ. Từ đó, doanh nghiệp có thể phân tích hành vi của các nhóm khách hàng VIP hoặc những đơn hàng bán sỉ quy mô lớn.
Thống kê số lượng khách hàng (Total Customers)
Mã DAX:
Total Customers = DISTINCTCOUNT(OrderHeader[CustomerID])

- Bối cảnh: Bảng OrderHeader chứa thông tin tổng quan của mỗi đơn hàng, trong đó một khách hàng (CustomerID) có thể mua hàng nhiều lần (phát sinh nhiều hóa đơn).
- Sử dụng DISTINCTCOUNT trên cột CustomerID đảm bảo rằng cho dù một khách hàng có mua 10 hay 100 lần trong tháng, họ vẫn chỉ được tính là 1 khách hàng duy nhất hoạt động (Active Customer). Con số này giúp đánh giá chính xác quy mô tệp khách hàng thực tế thay vì bị lầm tưởng do tần suất mua hàng lặp lại.
Ứng dụng của các hàm Aggregation trong Power BI
- Chuyển đổi bối cảnh động (Dynamic Context Transition): Khi kết hợp các hàm Aggregation cơ bản này với hàm CALCULATE, bạn có thể can thiệp trực tiếp vào bối cảnh bộ lọc để tính toán các chỉ số phức tạp như: tỷ lệ phần đóng góp doanh thu của một nhóm sản phẩm so với tổng doanh thu toàn doanh nghiệp (SUM của nhóm sản phẩm chia cho SUM tổng thể).
- Xây dựng các bộ chỉ số Thời Gian (Time Intelligence): Để tính lũy kế doanh thu từ đầu năm đến hiện tại (YTD – Year-To-Date), so sánh tăng trưởng doanh thu cùng kỳ năm ngoái (YoY – Year-over-Year), bạn bắt buộc phải sử dụng các biểu thức Aggregation (SUM(Total Sales)) lồng ghép vào các hàm thời gian của DAX như TOTALYTD hoặc SAMEPERIODLASTYEAR.
- Tối ưu hóa hiệu năng báo cáo: Sử dụng các Explicit Measures (Measure do người dùng tự viết bằng DAX) thay vì kéo thả trực tiếp các cột vào báo cáo giúp Power BI Engine tối ưu hóa bộ nhớ đệm, giảm thời gian render biểu đồ, giúp báo cáo chạy mượt mà ngay cả với hàng chục triệu dòng dữ liệu.
Tổng kết
Hiểu và làm chủ các phép toán Aggregation trong Power BI chính là ranh giới định hình năng lực giữa một người làm báo cáo thông thường và một chuyên gia phân tích dữ liệu thực thụ. Phép toán tổng hợp không chỉ đơn thuần là việc gom nhóm số liệu vật lý, mà là nền tảng cốt lõi giúp bạn chuyển hóa hàng triệu bản ghi giao dịch thô thành những insight có giá trị chiến lược sống còn cho doanh nghiệp.
Bạn muốn thực hành các hàm DAX như SUM, COUNT, DISTINCTCOUNT, CALCULATE, Time Intelligence và xây dựng Dashboard Power BI từ dữ liệu thực tế?
Tham khảo ngay Khóa học Power BI để được hướng dẫn từ cách xây dựng Data Model, viết Measure, tối ưu hiệu năng báo cáo đến triển khai Dashboard quản trị doanh nghiệp chuyên nghiệp.