Tuần 2 · Ngày 7 · Bài mới · 4 giờ
Mục tiêu
- Chuẩn hóa văn bản (hoa/thường, khoảng trắng giữa chuỗi)
- Tách, trích, ghép cột
- Thay giá trị, xử lý null, Fill Down
- Tạo cột mới từ ngày, cột điều kiện, Column From Examples, Custom Column đơn giản
Dữ liệu cần tải
Ngày 2: Power Query, biến đổi cột
Tiếp tục với file SaoMai_PQ_Tuan2.pbix và query DonHang (10.543 dòng) của hôm qua. Home > Transform data để mở lại Power Query.
Kế hoạch 4 giờ
| Thời gian | Nội dung |
|---|---|
| Giờ 1 | Đọc phần 1, làm phần 2 (chuẩn hóa văn bản) |
| Giờ 2 - 3 | Phần 3 - 6: tách/trích/ghép, thay giá trị, cột mới |
| Giờ 4 | Bài tập |
1. Transform hay Add Column?
| Bạn muốn | Dùng tab | Ví dụ |
|---|---|---|
| Sửa trực tiếp cột đang có | Transform | Viết hoa cột Kênh |
| Giữ cột cũ, tạo thêm cột mới | Add Column | Từ Ngày đặt tạo thêm cột Tháng |
Nhiều lệnh xuất hiện ở cả hai tab (Format, Extract, Date…). Chọn tab nào tùy bạn muốn thay hay thêm.
2. Chuẩn hóa văn bản
2.1 Chữ hoa, chữ thường
- Chọn cột Kênh > Transform > Format > UPPERCASE. Giờ chỉ còn
GTvàMT. - Chọn cột Vùng > Transform > Format > Capitalize Each Word.
MIỀN BẮC,miền bắcđều thànhMiền Bắc.
2.2 Khoảng trắng thừa ở giữa chuỗi
Trim chỉ cắt khoảng trắng ở đầu và cuối. “Tạp hóa Cô Lan” (2 dấu cách ở giữa) vẫn còn nguyên.
- Chọn cột Tên cửa hàng > Transform > Replace Values.
- Value To Find: gõ 2 dấu cách. Replace With: gõ 1 dấu cách.
- OK.
3. Tách, trích, ghép
3.1 Trích một phần văn bản (Extract)
Mã SKU có dạng SM-NGK-001: tiền tố công ty, mã ngành, số thứ tự. Lấy mã ngành ra cột riêng:
- Chọn cột Mã SKU > Add Column > Extract > Text Between Delimiters.
- Start delimiter =
-, End delimiter =-> OK. - Đổi tên cột mới (double-click tiêu đề) thành
Mã ngành.
Các lựa chọn khác trong Extract:
| Lệnh | Ví dụ với DH2501-00001 | Kết quả |
|---|---|---|
| Length | 12 | |
| First Characters (6) | DH2501 | |
| Last Characters (5) | 00001 | |
| Range (vị trí 2, dài 4) | Vị trí đếm từ 0 | 2501 |
Text Before Delimiter - | DH2501 | |
Text After Delimiter - | 00001 |
3.2 Tách cột (Split Column)
Split Column biến một cột thành nhiều cột. Khác với Extract là lấy một phần sang cột mới.
Thử trên một bản sao: chọn Mã SKU > chuột phải > Duplicate Column. Chọn cột bản sao > Transform > Split Column > By Delimiter > - > Each occurrence of the delimiter > OK. Kết quả là 3 cột: SM, NGK, 001.
Xóa 3 cột vừa tách. Ta đã có Mã ngành ở 3.1.
3.3 Ghép cột (Merge Columns)
- Chọn Mã CH, rồi Ctrl + click Tên cửa hàng. Thứ tự click chính là thứ tự ghép.
- Add Column > Merge Columns > Separator = Custom
-> New column name =Cửa hàng> OK. - Kết quả:
CH0003 - Tạp hóa Bà Khánh.
4. Thay giá trị và xử lý null
4.1 Thay null bằng 0
Cột CK đang trống ở các dòng không có chiết khấu. Trong Power Query, ô trống là giá trị null, và mọi phép tính với null đều ra null: 2 * 168000 * (1 - null) = null.
- Chọn cột CK > Transform > Replace Values.
- Value To Find =
null(gõ đúng chữ null), Replace With =0> OK.
4.2 Fill Down / Fill Up
Dùng khi một giá trị chỉ được ghi ở dòng đầu nhóm, các dòng dưới để trống với ý “giống dòng trên”. Đây là kiểu rất hay gặp trong báo cáo xuất từ phần mềm kế toán.
Thử với bảng nhỏ: Home > Enter Data, nhập bảng sau, đặt tên ThuFillDown > OK.
| Nhà phân phối | Tháng | Doanh thu |
|---|---|---|
| NPP Phú Thịnh | 1 | 100 |
| 2 | 120 | |
| 3 | 90 | |
| NPP Hoàng Long | 1 | 80 |
| 2 | 85 |
Chọn cột Nhà phân phối > Transform > Fill > Down. Các ô trống được điền bằng giá trị phía trên gần nhất.
Xóa query ThuFillDown sau khi thử xong (chuột phải > Delete).
5. Tạo cột mới
5.1 Từ cột ngày
Chọn Ngày đặt > Add Column > Date:
| Lệnh | Tạo ra | Ví dụ với 07/01/2025 |
|---|---|---|
| Year > Year | Năm | 2025 |
| Month > Month | Tháng (số) | 1 |
| Month > Name of Month | Tên tháng | January hoặc “Tháng Một”, tùy Locale |
| Quarter > Quarter of Year | Quý | 1 |
| Week > Week of Year | Tuần trong năm | 2 |
| Day > Name of Day | Thứ | Tuesday hoặc “Thứ Ba” |
| Day > Start of Week | Ngày đầu tuần | 06/01/2025 (thứ Hai) hoặc 05/01/2025 (Chủ nhật), tùy Locale |
Hôm nay tạo 2 cột: Tháng (số) và Thứ (Name of Day).
5.2 Conditional Column: cột theo điều kiện
Đặt tên ngành đầy đủ từ Mã ngành:
- Add Column > Conditional Column.
- New column name =
Ngành hàng. - Lần lượt thêm các mệnh đề (Add Clause):
| Column Name | Operator | Value | Output |
|---|---|---|---|
| Mã ngành | equals | NGK | Nước giải khát |
| Mã ngành | equals | SUA | Sữa & sản phẩm từ sữa |
| Mã ngành | equals | BKO | Bánh kẹo |
| Mã ngành | equals | GVI | Gia vị & thực phẩm khô |
| Mã ngành | equals | HPC | Chăm sóc nhà cửa & cá nhân |
- Else =
Khác> OK.
Ảnh chụp màn hình sẽ được bổ sung
Hộp thoại Add Conditional Column với 5 mệnh đề như bảng trên.
5.3 Custom Column: công thức tự viết
Tính Thành tiền = SL x Đơn giá x (1 - CK).
- Add Column > Custom Column.
- New column name =
Thành tiền. - Custom column formula: bấm đúp tên cột ở danh sách bên phải để chèn, không cần gõ tay:
[#"SL (thùng)"] * [Đơn giá] * (1 - [CK])
- OK. Đổi kiểu cột Thành tiền sang Fixed Decimal Number (ký hiệu $) hoặc Whole Number.
5.4 Column From Examples: cho máy tự đoán công thức
- Chọn cột Ngày đặt > Add Column > Column From Examples > From Selection.
- Ở cột mới bên phải, dòng đầu tiên (Ngày đặt 07/01/2025), gõ:
T1/2025. Nhấn Enter. - Power Query tự đoán công thức và điền các dòng còn lại. Kiểm tra vài dòng tháng 2, tháng 3. Nếu đúng, đổi tên cột thành
Kỳ> OK. - Xem Formula bar: Power Query đã tự viết code M cho bạn.
Column From Examples rất hữu ích khi bạn không biết hàm nhưng biết kết quả mong muốn. Luôn kiểm tra kỹ kết quả, vì máy có thể đoán sai quy luật.
6. Hoàn thiện và nạp
- Sắp xếp lại các cột: kéo thả tiêu đề cột theo thứ tự hợp lý.
- Kiểm tra Column quality: không có Error.
- Close & Apply.
7. Bài tập tự làm
Kiểm tra chuẩn hóa. Sau phần 2 và 4.1:
- Cột Kênh có mấy giá trị? Mỗi giá trị bao nhiêu dòng?
- Cột Vùng có mấy giá trị?
- Số tên cửa hàng khác nhau trước và sau khi thay 2 dấu cách bằng 1. Bật Column profile và xem Distinct của cột Tên cửa hàng ở 2 bước.
- Cột Mã CH có bao nhiêu giá trị khác nhau? So với số tên cửa hàng khác nhau, bạn rút ra điều gì?
- 2 giá trị: GT = 6.843 dòng, MT = 3.700 dòng.
- 3 giá trị: Miền Nam (4.394 dòng), Miền Bắc (3.378), Miền Trung (2.771).
- Trước khi thay: 440 tên. Sau khi thay: 247 tên. Gần 200 “tên” chỉ là biến thể do gõ thừa dấu cách.
- 456 mã cửa hàng khác nhau, nhưng chỉ 247 tên. Nghĩa là nhiều cửa hàng trùng tên. Luôn dùng mã để phân biệt đối tượng; tên chỉ để hiển thị.
Mẹo xem Distinct chính xác: đặt profiling trên entire data set (bấm vào thanh trạng thái phía dưới). Hoặc chuột phải cột > Remove Duplicates rồi xem số dòng, nhớ xóa bước này sau khi xem.
Thành tiền. Sau phần 5.3, Close & Apply rồi tạo các visual để trả lời:
- Tổng Thành tiền Q1/2025.
- Thành tiền theo Vùng.
- Thành tiền theo Tháng.
- Thử: nếu bỏ qua bước Replace null → 0 ở cột CK thì tổng Thành tiền thay đổi thế nào? Vì sao?
-
Tổng Thành tiền Q1/2025 = 12.091.023.690.
-
Theo vùng:
| Vùng | Thành tiền Q1/2025 |
|---|---|
| Miền Nam | 5.131.204.600 |
| Miền Bắc | 3.837.242.650 |
| Miền Trung | 3.122.576.440 |
- Theo tháng:
| Tháng | Thành tiền |
|---|---|
| 1 | 5.264.785.790 |
| 2 | 3.240.399.080 |
| 3 | 3.585.838.820 |
Khớp với số liệu tháng 1 - 3/2025 trong file tuần 1. Bạn đã tự tái tạo chính xác doanh thu từ file “bẩn”.
- Nếu bỏ qua bước Replace null, mọi dòng có CK trống sẽ có Thành tiền = null. Tổng chỉ còn cộng các dòng có chiết khấu, thiếu khoảng một nửa. Đây là lỗi im lặng: không báo đỏ, chỉ ra số sai.
Kiểm tra trong Power Query: sau khi tạo Thành tiền, xem Column quality. Nếu cột Thành tiền có Empty > 0%, chắc chắn có null lọt vào.
Cột điều kiện: quy mô dòng hàng. Tạo Conditional Column Quy mô dựa trên Thành tiền:
- Thành tiền < 1.000.000 →
Nhỏ - Thành tiền < 5.000.000 →
Vừa - Còn lại →
Lớn
Đếm số dòng mỗi nhóm. Vì sao thứ tự các mệnh đề lại quan trọng?
| Quy mô | Số dòng |
|---|---|
| Nhỏ | 5.730 |
| Vừa | 4.719 |
| Lớn | 94 |
Thứ tự quan trọng vì Conditional Column kiểm tra từ trên xuống và dừng ở điều kiện đúng đầu tiên. Nếu đặt ”< 5.000.000 → Vừa” lên trước, mọi dòng < 1.000.000 cũng thỏa và bị gán “Vừa”. Nhóm “Nhỏ” sẽ trống.
Code M tương ứng (xem trên Formula bar):
= Table.AddColumn(#"Previous Step", "Quy mô", each if [Thành tiền] < 1000000 then "Nhỏ" else if [Thành tiền] < 5000000 then "Vừa" else "Lớn")Trích xuất. Tạo các cột mới:
- Kỳ đơn hàng: lấy 4 ký tự sau “DH” trong Mã đơn hàng, ví dụ
DH2501-00001→2501. - Thứ: tên thứ trong tuần từ Ngày đặt. Ngày nào trong tuần có nhiều dòng đơn hàng nhất? Có dòng nào rơi vào Chủ nhật không?
- Số đơn hàng Q1/2025: không tạo cột, dùng card Count (Distinct) Mã đơn hàng.
1. Kỳ đơn hàng: Add Column > Extract > Range > Starting Index = 2, Number of Characters = 4. Vị trí đếm từ 0: D = 0, H = 1, “2” = 2.
Cách khác: Text Between Delimiters với Start = DH, End = -.
2. Thứ:
| Thứ | Số dòng |
|---|---|
| Thứ Hai (Monday) | 2.094 |
| Thứ Sáu (Friday) | 1.882 |
| Thứ Năm (Thursday) | 1.808 |
| Thứ Bảy (Saturday) | 1.668 |
| Thứ Tư (Wednesday) | 1.577 |
| Thứ Ba (Tuesday) | 1.514 |
Không có Chủ nhật, vì nhân viên bán hàng không đi tuyến ngày Chủ nhật. Kiểm tra kiểu này giúp bạn phát hiện dữ liệu bất thường: nếu thấy đơn ngày Chủ nhật, có thể ngày đã bị đổi sai Locale.
3. Số đơn hàng Q1/2025 = 2.522.
Đọc và sửa code M. Mở Advanced Editor của query DonHang.
- Tìm dòng code của bước Conditional Column Quy mô. Sửa ngưỡng 5.000.000 thành 3.000.000 trực tiếp trong code, bấm Done. Số dòng nhóm “Lớn” thay đổi thế nào?
- Tìm dòng code của bước tạo Thành tiền. Code có chứa
eachkhông? Theo bạn,eachcó ý nghĩa gì? - Sửa lại ngưỡng về 5.000.000.
1. Đổi 5000000 thành 3000000 trong dòng:
#"Added Conditional Column1" = Table.AddColumn(..., "Quy mô", each if [Thành tiền] < 1000000 then "Nhỏ" else if [Thành tiền] < 3000000 then "Vừa" else "Lớn")Nhóm “Lớn” tăng mạnh, vì giờ mọi dòng từ 3 triệu trở lên đều là “Lớn”. Dùng Column distribution để xem số mới.
2. Có. each nghĩa là “với mỗi dòng”. each [Thành tiền] < 1000000 đọc là “với mỗi dòng, lấy Thành tiền của dòng đó so với 1 triệu”. Tuần 4 sẽ học kỹ each và _.
Mẹo: sửa code trong Advanced Editor nhanh hơn mở lại hộp thoại khi bạn chỉ đổi một con số. Nhưng nếu gõ sai cú pháp, Power Query báo lỗi ngay. Đọc thông báo lỗi, sửa lại, hoặc bấm Cancel để hủy.
8. Tự đánh giá
- Tôi phân biệt được tab Transform và Add Column
- Tôi chuẩn hóa được văn bản: UPPERCASE, Capitalize Each Word, Replace khoảng trắng kép
- Tôi phân biệt được Extract và Split Column
- Tôi biết null làm phép tính ra null, và xử lý được bằng Replace Values
- Tôi biết Fill Down dùng khi nào và vì sao đôi khi “không ăn”
- Tôi tạo được Conditional Column và hiểu thứ tự mệnh đề
- Tổng Thành tiền Q1/2025 của tôi đúng 12.091.023.690