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 gianNội dung
Giờ 1Phần 1: dạng rộng và dạng dài; phần 2: Unpivot
Giờ 2 - 3Phần 3 - 5: Pivot, Group By, Transpose
Giờ 4Bà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

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

  1. Get data > Excel workbook > ChiTieu_2025.xlsx > tick sheet ChiTieu (triệu đồng) > Transform Data.
  2. Đổi tên query thành ChiTieu.
  3. 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.
  4. Chọn 3 cột Mã NPP, Tên NPP, Ngành hàng. Đây là các cột giữ nguyên.
  5. Chuột phải > Unpivot Other Columns.
  6. 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).

90 dòng x 12 tháng = 1.080 dòng.

2.2 Ba lệnh Unpivot khác nhau thế nào?

LệnhBạn chọnPower Query xoayKhi file có thêm cột T13
Unpivot Other ColumnsCác cột giữ nguyênMọi cột còn lạiT13 tự được xoay ✅
Unpivot ColumnsCác cột cần xoayCác cột đã chọnPower Query thường tự viết lại thành “Other Columns”
Unpivot Only Selected ColumnsCác cột cần xoayChỉ các cột đã chọn, ghi cứng tênT13 bị bỏ qua ❌

Dùng Unpivot Other Columns trong đa số trường hợp.

2.3 Hoàn thiện bảng ChiTieu

  1. Tháng → số: chọn cột Tháng > Transform > Replace Values T → (để trống). Đổi kiểu sang Whole Number.
  2. Tạo cột ngày đầu tháng: Add Column > Custom Column, tên Ngày:
    #date(2025, [Tháng], 1)
    Đổi kiểu sang Date.
  3. Đổi đơn vị sang đồng: Add Column > Custom Column, tên Chỉ tiêu:
    [#"Chỉ tiêu (triệu)"] * 1000000
    Đổi kiểu sang Whole Number. Xóa cột Chỉ tiêu (triệu) và cột Tháng nế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.

  1. Bỏ bớt cột, chỉ giữ Tên NPP, Ngành hàng, Chỉ tiêu.
  2. Chọn cột Ngành hàng > Transform > Pivot Column.
  3. Values Column = Chỉ tiêu. Mở Advanced options > Aggregate Value Function = Sum > OK.
  4. 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.

  1. Chọn cột Vùng > Transform > Group By.
  2. Basic: Group by = Vùng; New column name = Doanh thu; Operation = Sum; Column = Thành tiền > OK.
  3. 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.

  1. Chọn Mã đơn hàng > Group By > Advanced.
  2. Group by: Mã đơn hàng. Bấm Add grouping để thêm Ngày đặt, Mã CH, Kênh.
  3. Phép tính (Add aggregation):
New column nameOperationColumn
Số dòngCount Rows
Số thùngSumSL (thùng)
Giá trị đơnSumThành tiền
  1. 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ínhSP1SP2
Mã SKUSM-NGK-001SM-SUA-001
Giá168000336000

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:

  1. Bảng có bao nhiêu dòng?
  2. Tổng chỉ tiêu cả năm 2025 là bao nhiêu (đơn vị đồng)?
  3. Chỉ tiêu theo ngành hàng: ngành nào cao nhất?
  4. Tháng nào có chỉ tiêu cao nhất? Có hợp lý không?
  1. 1.080 dòng (90 x 12).
  2. Tổng = 48.427 triệu = 48.427.000.000 đồng.
  3. Chỉ tiêu theo ngành:
Ngành hàngChỉ tiêu 2025 (triệu)
Chăm sóc nhà cửa & cá nhân11.998
Gia vị & thực phẩm khô11.045
Sữa & sản phẩm từ sữa9.240
Bánh kẹo8.718
Nước giải khát7.426
  1. 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):

  1. Có bao nhiêu đơn hàng trong Q1/2025?
  2. Trung bình mỗi đơn có mấy dòng sản phẩm?
  3. Đơn hàng có giá trị lớn nhất là đơn nào, giá trị bao nhiêu?
  4. Giá trị đơn trung bình của kênh GT và MT?
  1. 2.522 đơn, bằng số dòng của query DonHang_TheoDon.
  2. Trung bình khoảng 4,18 dòng mỗi đơn (10.543 / 2.522).
  3. 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.
  4. Theo kênh:
KênhSố đơnGiá trị đơn trung bình
GT1.705khoảng 3.900.006
MT817khoả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:

  1. 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.
  2. Sau đó Pivot cột Tháng để mỗi tháng là một cột.
  3. 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ùng123
Miền Bắc1.650.351.1501.056.237.0501.130.654.450
Miền Nam2.192.831.4301.399.258.5601.539.114.610
Miền Trung1.421.603.210784.903.470916.069.760

Mức giảm từ tháng 1 sang tháng 2:

VùngMức giảm
Miền Bắckhoảng -36,0%
Miền Namkhoảng -36,2%
Miền Trungkhoả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ã CHTên cửa hàngSố đơnDoanh thu Q1/2025
CH0113Siêu thị Đầu Làng23159.632.610
CH0339Siêu thị mini Tân Phú22155.864.840
CH0141Siêu thị mini Đầu Làng25134.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:
    List.Count(List.Distinct([Bảng con][Mã đơn hàng]))
    Thay Bảng con bằ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