Tuần 2 · Ngày 9 · Bài mới · 4 giờ
Mục tiêu
- Phân biệt dữ liệu dạng rộng (wide) và dạng dài (long)
- Unpivot để đưa dữ liệu về dạng Power BI cần; Pivot khi cần làm ngược lại
- Tổng hợp dữ liệu bằng Group By (cơ bản và nâng cao)
- Biết Transpose dùng khi nào
Dữ liệu cần tải
Ngày 4: Unpivot, Pivot, Group By, Transpose
Kế hoạch 4 giờ
| Thời gian | Nội dung |
|---|---|
| Giờ 1 | Phần 1: dạng rộng và dạng dài; phần 2: Unpivot |
| Giờ 2 - 3 | Phần 3 - 5: Pivot, Group By, Transpose |
| Giờ 4 | Bài tập |
Dùng file SaoMai_PQ_Tuan2.pbix (đã có query DonHang sạch, có cột Thành tiền).
1. Dữ liệu dạng rộng và dạng dài
Phòng kế hoạch gửi bảng chỉ tiêu doanh thu 2025 ChiTieu_2025.xlsx:
- Mỗi dòng là một cặp NPP x Ngành hàng: 18 NPP x 5 ngành = 90 dòng.
- Mỗi tháng là một cột: T1, T2, …, T12.
- Đơn vị: triệu đồng.
Đây là dạng rộng (wide): dễ đọc cho người, nhưng khó dùng trong Power BI:
- Không có cột “Tháng” để kéo vào trục X hay slicer.
- Không thể so với doanh thu thực tế (vốn theo từng ngày) theo tháng.
- Năm sau có thêm cột thì báo cáo phải sửa.
Dạng dài (long) thì mỗi dòng là NPP x Ngành x Tháng, chỉ có 1 cột giá trị Chỉ tiêu. Đây là dạng Power BI cần.
2. Unpivot
2.1 Thực hành
- Get data > Excel workbook >
ChiTieu_2025.xlsx> tick sheet ChiTieu (triệu đồng) > Transform Data. - Đổi tên query thành
ChiTieu. - Kiểm tra dòng đầu đã là tên cột (Mã NPP, Tên NPP, Ngành hàng, T1…). File này sạch, nên bước Promoted Headers tự động là đúng.
- Chọn 3 cột Mã NPP, Tên NPP, Ngành hàng. Đây là các cột giữ nguyên.
- Chuột phải > Unpivot Other Columns.
- Kết quả có 2 cột mới:
- Attribute: chứa T1, T2, … (trước đây là tên cột). Đổi tên thành
Tháng. - Value: chứa con số. Đổi tên thành
Chỉ tiêu (triệu).
- Attribute: chứa T1, T2, … (trước đây là tên cột). Đổi tên thành
90 dòng x 12 tháng = 1.080 dòng.
2.2 Ba lệnh Unpivot khác nhau thế nào?
| Lệnh | Bạn chọn | Power Query xoay | Khi file có thêm cột T13 |
|---|---|---|---|
| Unpivot Other Columns | Các cột giữ nguyên | Mọi cột còn lại | T13 tự được xoay ✅ |
| Unpivot Columns | Các cột cần xoay | Các cột đã chọn | Power Query thường tự viết lại thành “Other Columns” |
| Unpivot Only Selected Columns | Các cột cần xoay | Chỉ các cột đã chọn, ghi cứng tên | T13 bị bỏ qua ❌ |
Dùng Unpivot Other Columns trong đa số trường hợp.
2.3 Hoàn thiện bảng ChiTieu
- Tháng → số: chọn cột Tháng > Transform > Replace Values
T→ (để trống). Đổi kiểu sang Whole Number. - Tạo cột ngày đầu tháng: Add Column > Custom Column, tên
Ngày:
Đổi kiểu sang Date.#date(2025, [Tháng], 1) - Đổi đơn vị sang đồng: Add Column > Custom Column, tên
Chỉ tiêu:
Đổi kiểu sang Whole Number. Xóa cột[#"Chỉ tiêu (triệu)"] * 1000000Chỉ tiêu (triệu)và cộtThángnếu không cần.
3. Pivot: làm ngược lại Unpivot
Pivot Column biến giá trị của một cột thành nhiều cột. Ít dùng hơn Unpivot, nhưng có ích khi cần tạo bảng tổng hợp để xuất ra hoặc so sánh.
Thử trên bản sao: chuột phải query ChiTieu > Reference, đặt tên ThuPivot.
- Bỏ bớt cột, chỉ giữ Tên NPP, Ngành hàng, Chỉ tiêu.
- Chọn cột Ngành hàng > Transform > Pivot Column.
- Values Column =
Chỉ tiêu. Mở Advanced options > Aggregate Value Function = Sum > OK. - Kết quả: mỗi dòng là một NPP, mỗi ngành là một cột, giá trị là tổng chỉ tiêu cả năm.
4. Group By: tổng hợp trong Power Query
Group By giống GROUP BY trong SQL hay PivotTable, nhưng kết quả là một bảng mới.
4.1 Group By cơ bản
Tạo query tham chiếu: chuột phải DonHang > Reference, đặt tên DonHang_TheoVung.
- Chọn cột Vùng > Transform > Group By.
- Basic: Group by =
Vùng; New column name =Doanh thu; Operation = Sum; Column =Thành tiền> OK. - Kết quả: 3 dòng.
4.2 Group By nâng cao: nhiều cột nhóm, nhiều phép tính
Tạo query tham chiếu DonHang_TheoDon từ DonHang.
- Chọn Mã đơn hàng > Group By > Advanced.
- Group by:
Mã đơn hàng. Bấm Add grouping để thêmNgày đặt,Mã CH,Kênh. - Phép tính (Add aggregation):
| New column name | Operation | Column |
|---|---|---|
| Số dòng | Count Rows | |
| Số thùng | Sum | SL (thùng) |
| Giá trị đơn | Sum | Thành tiền |
- OK. Mỗi dòng giờ là một đơn hàng.
Ảnh chụp màn hình sẽ được bổ sung
Hộp thoại Group By chế độ Advanced, có 4 cột nhóm và 3 phép tổng hợp như bảng trên.
Các phép tính có sẵn: Sum, Average, Median, Min, Max, Count Rows, Count Distinct Rows, All Rows (giữ lại bảng con, nâng cao).
5. Transpose: lật bảng
Transform > Transpose đổi dòng thành cột và cột thành dòng, kiểu xoay ma trận. Tên cột bị mất, nên thường phải Use First Row as Headers lại.
Dùng khi file Excel bị nhập ngang, ví dụ thông tin mỗi sản phẩm nằm trên một cột. Thử nhanh: Home > Enter Data, nhập bảng sau, đặt tên ThuTranspose:
| Thuộc tính | SP1 | SP2 |
|---|---|---|
| Mã SKU | SM-NGK-001 | SM-SUA-001 |
| Giá | 168000 | 336000 |
Transpose > Use First Row as Headers → được bảng có cột Thuộc tính, Mã SKU, Giá… Đổi tên cột đầu thành Sản phẩm. Xóa query sau khi thử.
6. Bài tập tự làm
Kiểm tra bảng ChiTieu. Sau phần 2:
- Bảng có bao nhiêu dòng?
- Tổng chỉ tiêu cả năm 2025 là bao nhiêu (đơn vị đồng)?
- Chỉ tiêu theo ngành hàng: ngành nào cao nhất?
- Tháng nào có chỉ tiêu cao nhất? Có hợp lý không?
- 1.080 dòng (90 x 12).
- Tổng = 48.427 triệu = 48.427.000.000 đồng.
- Chỉ tiêu theo ngành:
| Ngành hàng | Chỉ tiêu 2025 (triệu) |
|---|---|
| Chăm sóc nhà cửa & cá nhân | 11.998 |
| Gia vị & thực phẩm khô | 11.045 |
| Sữa & sản phẩm từ sữa | 9.240 |
| Bánh kẹo | 8.718 |
| Nước giải khát | 7.426 |
- Tháng 1: 5.400 triệu, cao nhất. Hợp lý, vì tháng 1/2025 là tháng cao điểm Tết. Tháng 2 thấp nhất: 3.324 triệu.
So sánh nhanh: doanh thu thực tế 2025 (tuần 1) là 47.445 triệu, chỉ tiêu là 48.427 triệu. Công ty đạt khoảng 98% chỉ tiêu năm. Đến tuần 5 - 6, khi có mô hình dữ liệu, bạn sẽ so sánh được theo từng NPP, từng tháng.
Group By theo đơn hàng. Dùng query DonHang_TheoDon (phần 4.2):
- Có bao nhiêu đơn hàng trong Q1/2025?
- Trung bình mỗi đơn có mấy dòng sản phẩm?
- Đơn hàng có giá trị lớn nhất là đơn nào, giá trị bao nhiêu?
- Giá trị đơn trung bình của kênh GT và MT?
- 2.522 đơn, bằng số dòng của query
DonHang_TheoDon. - Trung bình khoảng 4,18 dòng mỗi đơn (10.543 / 2.522).
- Lớn nhất: DH2501-00475, giá trị khoảng 19.071.800, gồm 6 dòng sản phẩm. Cách tìm: sắp giảm dần cột Giá trị đơn trong Power Query, hoặc dùng card Max sau khi nạp.
- Theo kênh:
| Kênh | Số đơn | Giá trị đơn trung bình |
|---|---|---|
| GT | 1.705 | khoảng 3.900.006 |
| MT | 817 | khoảng 6.660.359 |
Cách làm: Close & Apply, tạo Matrix: Rows = Kênh, Values = Giá trị đơn với kiểu Average.
Tại sao phải Group By theo đơn trước? Nếu lấy Average của Thành tiền trên bảng DonHang (mỗi dòng là một sản phẩm), bạn được giá trị trung bình mỗi dòng sản phẩm, không phải mỗi đơn. Đây lại là câu chuyện grain: muốn trung bình theo đơn thì mỗi dòng phải là một đơn.
Group By 2 chiều và Pivot. Từ DonHang:
- Tạo query tham chiếu, Group By theo Vùng và Tháng (cột Tháng tạo ở ngày 2), tổng Thành tiền.
- Sau đó Pivot cột Tháng để mỗi tháng là một cột.
- Miền nào có mức giảm doanh thu từ tháng 1 sang tháng 2 lớn nhất (tính theo %)?
Kết quả sau Group By + Pivot:
| Vùng | 1 | 2 | 3 |
|---|---|---|---|
| Miền Bắc | 1.650.351.150 | 1.056.237.050 | 1.130.654.450 |
| Miền Nam | 2.192.831.430 | 1.399.258.560 | 1.539.114.610 |
| Miền Trung | 1.421.603.210 | 784.903.470 | 916.069.760 |
Mức giảm từ tháng 1 sang tháng 2:
| Vùng | Mức giảm |
|---|---|
| Miền Bắc | khoảng -36,0% |
| Miền Nam | khoảng -36,2% |
| Miền Trung | khoảng -44,8%, giảm mạnh nhất |
Lưu ý khi Pivot: cột Tháng là số thì tên cột sau Pivot là “1”, “2”, “3”. Ở bước Pivot đã có tổng sẵn từ Group By, nên có thể chọn Don’t Aggregate. Nếu bỏ qua Group By và Pivot thẳng từ bảng chi tiết, phải chọn Sum.
Top cửa hàng. Từ DonHang, Group By theo Mã CH và Tên cửa hàng, tính:
- Số đơn: số mã đơn hàng khác nhau của cửa hàng.
- Doanh thu: Sum Thành tiền.
Gợi ý: phép Count Distinct Rows đếm số dòng khác nhau, không phải số giá trị khác nhau của một cột. Hãy thử nó, xem kết quả có đúng không, rồi tìm cách khác.
Top 3 cửa hàng theo doanh thu Q1/2025 là cửa hàng nào?
| Mã CH | Tên cửa hàng | Số đơn | Doanh thu Q1/2025 |
|---|---|---|---|
| CH0113 | Siêu thị Đầu Làng | 23 | 159.632.610 |
| CH0339 | Siêu thị mini Tân Phú | 22 | 155.864.840 |
| CH0141 | Siêu thị mini Đầu Làng | 25 | 134.208.620 |
Cách đếm số đơn khác nhau:
- Cách 1, dễ nhất: Group By trên query
DonHang_TheoDon(đã mỗi dòng một đơn), theo Mã CH, với phép tính Count Rows. - Cách 2: trong Group By của
DonHang, chọn Operation = All Rows (tạo cột bảng con), rồi thêm Custom Column:
ThayList.Count(List.Distinct([Bảng con][Mã đơn hàng]))Bảng conbằng tên cột All Rows của bạn. Đây là kỹ thuật nâng cao, sẽ gặp lại ở tuần 4. - Cách 3: sửa code M của bước Group By, thay phép đếm bằng
each List.Count(List.Distinct([Mã đơn hàng])).
Count Distinct Rows không đúng ở đây: nó đếm số dòng khác nhau trong nhóm, mà các dòng của cùng một đơn đều khác nhau (khác sản phẩm).
7. Tự đánh giá
- Tôi nhận ra dữ liệu dạng rộng cần Unpivot
- Tôi dùng Unpivot Other Columns và hiểu vì sao nó an toàn hơn
- Tôi đưa đơn vị về cùng một chuẩn (triệu → đồng)
- Tôi dùng được Group By cơ bản và nâng cao
- Tôi hiểu vì sao muốn “trung bình mỗi đơn” thì phải đổi grain sang đơn hàng
- Tôi phân biệt được Pivot, Unpivot, Transpose