Tuần 3 · Ngày 14 · Bài mới · 4 giờ
Mục tiêu
- Dựng bảng phân tích sổ cái có tên tài khoản, phòng ban, chỉ tiêu P&L bằng nhiều lần Merge
- Nhận ra và sửa lỗi nhân dòng do khóa trùng ở bảng danh mục, bảng mapping
- Kiểm tra số dòng và tổng tiền trước và sau mỗi bước Merge
- Phân biệt dữ liệu "mồ côi" thật với dữ liệu chỉ nằm ngoài phạm vi bảng tra cứu
Ngày 14: Dựng bảng phân tích, lỗi nhân dòng
Kế hoạch 4 giờ
| Thời gian | Nội dung |
|---|---|
| Giờ 1 | Phần 1: bảng phân tích và quy tắc kiểm tra |
| Giờ 2 - 3 | Phần 2 - 3: Merge phòng ban, mapping, phát hiện và sửa nhân dòng |
| Giờ 4 | Bài tập, có bài phụ về hàng trả |
1. Bảng phân tích và quy tắc “trước, sau”
Bảng phân tích là một bảng có đủ thông tin để trả lời câu hỏi của người đọc mà không phải tra thêm: mỗi dòng sổ cái có tên tài khoản, tên phòng ban, chỉ tiêu P&L. Hôm nay vk iu dựng bảng SoCai_PhanTich từ SoCai bằng 3 lần Merge.
Mỗi lần Merge Left Outer với một bảng danh mục, có một quy tắc đơn giản:
Nếu bảng phải không trùng khóa, số dòng và tổng tiền KHÔNG được thay đổi.
Vì vậy, trước và sau mỗi bước Merge, ghi lại 3 con số: số dòng, tổng Nợ, tổng Có. Làm thành thói quen bằng một bảng nhỏ trong Excel hoặc ghi chú:
| Bước | Số dòng | Tổng Nợ | Tổng Có |
|---|---|---|---|
| SoCai (sau Append) | 10.311 | 381.805.417.644 | 381.805.417.644 |
| + Tên tài khoản | ? | ? | ? |
| + Phòng ban | ? | ? | ? |
| + Chỉ tiêu P&L | ? | ? | ? |
Cách xem nhanh: tạo một query Reference từ bước cần kiểm tra, Group By không chọn cột nhóm (bỏ hết cột ở ô Group by), thêm 3 phép: Count Rows, Sum No, Sum Co. Hoặc nạp vào Power BI và dùng 3 card.
2. Thực hành: Merge phòng ban, phát hiện nhân dòng
- Từ query SoCai (đã có tên tài khoản, ngày 1), tạo Reference đặt tên SoCai_PhanTich.
- Nạp sheet DanhMucPhongBan từ
DanhMuc_TaiKhoan_PhongBan.xlsx, đặt tên DimPhongBan. Kiểu Mã PB = Text. - Merge SoCai_PhanTich (MaPhongBan) với DimPhongBan (Mã PB), Left Outer, mở rộng cột Tên phòng ban.
- Kiểm tra: số dòng là 10.576, tăng 265 dòng so với 10.311. Tổng Nợ tăng thành 383.516.755.495.
Chuyện gì đã xảy ra? Mở DimPhongBan, Group By Mã PB, đếm số dòng:
| Mã PB | Số dòng | Lý do |
|---|---|---|
| MKT | 2 | “Marketing” (hiệu lực đến 30/06/2024) và “Marketing & Trade” (từ 01/07/2024): phòng đổi tên |
| Các mã khác | 1 |
Mỗi dòng sổ cái của MKT tìm thấy 2 dòng ở DimPhongBan, nên bị nhân đôi. Năm 2025 có 265 dòng MKT, nên thêm đúng 265 dòng, và tổng Nợ tăng đúng 1.711.337.851 (tổng Nợ của các dòng MKT).
Cách sửa (chọn 1):
- Cách 1 (đơn giản, dùng hôm nay): ở DimPhongBan, lọc Hiệu lực đến = null, tức chỉ giữ tên hiện hành. Mỗi mã còn 1 dòng. Năm 2025 không còn phòng NSHC nên không ảnh hưởng.
- Cách 2: Remove Duplicates theo Mã PB sau khi sắp xếp Hiệu lực từ giảm dần. Cẩn thận: Power Query không luôn giữ đúng thứ tự sắp xếp khi Remove Duplicates; cách 1 an toàn hơn.
Sau khi sửa, Refresh: SoCai_PhanTich về lại 10.311 dòng, tổng Nợ 381.805.417.644.
3. Thực hành: Merge mapping, nhân dòng lần 2
- Nạp
Mapping_TaiKhoan_PL.xlsx(bản gốc, chưa sửa như bài ngày 2) đặt tên MappingPL. - Merge SoCai_PhanTich (MaTK) với MappingPL (Mã TK), Left Outer, mở rộng Mã số và Chỉ tiêu P&L.
- Kiểm tra: 10.347 dòng, tăng 36. Tổng Nợ tăng 1.058.600.938, tổng Có cũng tăng 1.058.600.938.
Đây là lỗi 6417 map 2 lần đã gặp ở bài tập ngày 2. Năm 2025, TK 6417 có 36 dòng: 24 dòng chi phí vận chuyển (bên Nợ) và 12 dòng kết chuyển cuối tháng (bên Có). Cả 36 dòng bị nhân đôi.
Lần này tổng Nợ và tổng Có tăng bằng nhau, nên kiểm tra “Nợ = Có” vẫn đạt. Chỉ kiểm tra số dòng và tổng so với trước khi Merge mới bắt được lỗi.
Sửa: xóa dòng 6417 mã số 26 trong file mapping, thêm 4 tài khoản còn thiếu (5212, 64281, 711, 811), Refresh. Bảng kiểm tra cuối cùng:
| Bước | Số dòng | Tổng Nợ | Tổng Có |
|---|---|---|---|
| SoCai | 10.311 | 381.805.417.644 | 381.805.417.644 |
| + Tên tài khoản | 10.311 | 381.805.417.644 | 381.805.417.644 |
| + Phòng ban (đã lọc tên hiện hành) | 10.311 | 381.805.417.644 | 381.805.417.644 |
| + Chỉ tiêu P&L (đã sửa mapping) | 10.311 | 381.805.417.644 | 381.805.417.644 |
Ba con số không đổi qua mọi bước: bảng phân tích của vk iu an toàn.
4. Bài tập tự làm
Hoàn thiện SoCai_PhanTich (thời gian gợi ý: 40 phút)
- Làm đủ 3 lần Merge với các danh mục đã sửa. Thêm cột LoaiCT = 2 ký tự đầu SoCT.
- Tạo query PL_2025 (Reference): bỏ LoaiCT = KC, giữ dòng có Mã số khác null, thêm cột SoTien = Co − No, Group By theo Mã số và Chỉ tiêu P&L, tổng SoTien.
- Kết quả có khớp P&L năm 2025 dưới đây không?
| Mã số | Chỉ tiêu | Số tiền (Có − Nợ) |
|---|---|---|
| 01 | Doanh thu bán hàng | 43.902.134.500 |
| 02 | Giảm trừ doanh thu | −636.790.941 |
| 11 | Giá vốn hàng bán | −28.869.928.045 |
| 21 | Doanh thu tài chính | 16.815.148 |
| 22 | Chi phí tài chính | −642.926.643 |
| 25 | Chi phí bán hàng | −7.155.662.506 |
| 26 | Chi phí quản lý doanh nghiệp | −3.872.041.451 |
| 31 | Thu nhập khác | 125.000.000 |
| 32 | Chi phí khác | −13.062.469 |
| 51 | Chi phí thuế TNDN | −570.707.519 |
Nếu các danh mục đã sửa đúng, PL_2025 khớp từng dòng với bảng trên. Cộng các dòng 01 → 32 ra lợi nhuận trước thuế 2.853.537.593; trừ thuế (dòng 51) ra lợi nhuận sau thuế 2.282.830.074.
Nếu lệch, dò theo thứ tự:
| Dòng lệch | Nguyên nhân thường gặp |
|---|---|
| Mọi dòng bằng 0 | Chưa bỏ chứng từ KC |
| 25 lớn hơn khoảng 15% | 6417 vẫn bị map 2 lần (25 tăng 1.058.600.938) |
| 26 thiếu 123.778.649 | Chưa thêm 64281 |
| 02 thiếu 59.682.102 | Chưa thêm 5212 |
| Thiếu dòng 31, 32 | Chưa thêm 711, 811 |
Dấu âm: bảng dùng Có − Nợ nên doanh thu dương, chi phí âm. Đây là dấu “tự nhiên” của sổ cái. Khi trình bày P&L, người ta thường lật dấu để chi phí cũng hiện số dương (học ở tuần 11).
Doanh thu: hàng trả về không có đơn gốc (thời gian gợi ý: 30 phút)
File TraHang_DonHang_2025.xlsx có sheet TraHang (hàng cửa hàng trả lại NPP năm 2025) và sheet DonHang (danh sách đơn hàng năm 2025).
- Dùng Left Anti tìm các dòng hàng trả không có mã đơn trong danh sách đơn hàng.
- Có bao nhiêu dòng? Tất cả có phải là “mồ côi” thật không? Gợi ý: nhìn kỹ mã đơn hàng.
- Left Anti trả về 42 dòng.
- Không phải tất cả. Mã đơn có dạng
DH+ năm (2 số) + tháng (2 số) + số thứ tự:
| Nhóm | Số dòng | Giải thích |
|---|---|---|
Mã DH2412-... | 30 | Đơn hàng tháng 12/2024, khách trả lại đầu năm 2025. Đơn gốc có thật, chỉ là không nằm trong danh sách đơn năm 2025 |
Mã DH25..-9.... | 12 (29 thùng) | Mồ côi thật: số thứ tự bắt đầu bằng 9, không tồn tại trong phần mềm bán hàng. Cần hỏi NPP |
Bài học: Left Anti trả về những dòng không tìm thấy trong bảng tra cứu đang có, không phải những dòng không tồn tại. Trước khi kết luận “dữ liệu sai”, kiểm tra phạm vi của bảng tra cứu (thời gian, công ty, chi nhánh). Muốn kiểm tra đúng, cần danh sách đơn từ 12/2024 trở đi (dùng data/goc/FactDonHang.csv).
Merge 2 cột khóa (thời gian gợi ý: 25 phút)
FP&A muốn so chi phí thực tế với Budget theo phòng ban và tài khoản. Bảng Budget (NganSach_ChiPhi_2025.xlsx dạng dài, tuần 2) có khóa là cặp (Mã PB, Mã TK, Tháng), không phải một cột.
- Group By SoCai_PhanTich (bỏ KC, chỉ TK 641x, 642x, chỉ quý 1) theo MaPhongBan, MaTK, Tháng (thêm cột Tháng từ NgayHachToan).
- Merge với query NganSach (tuần 2) bằng 3 cột khóa cùng lúc: giữ Ctrl và bấm lần lượt 3 cột ở mỗi bảng, theo cùng thứ tự.
- Dùng Full Outer thay vì Left Outer. Vì sao?
-
Trong hộp thoại Merge, số thứ tự nhỏ (1, 2, 3) hiện cạnh tên cột cho biết cặp nào ghép với cặp nào. Thứ tự phải giống nhau ở 2 bảng.
-
Full Outer giữ cả dòng có thực tế mà không có Budget (ví dụ 64281 chi phí tiếp khách, TK mới mở, chưa có trong Budget) và dòng có Budget mà không phát sinh (ví dụ phòng chưa tiêu khoản đã duyệt). Dùng Left Outer từ thực tế sẽ mất dòng Budget chưa tiêu, làm tổng Budget nhỏ hơn 2.705.000.000. Với báo cáo Actual vs Budget, Full Outer là lựa chọn đúng, sau đó thay null bằng 0 ở cả 2 cột số tiền.
Tổng cột thực tế sau Merge phải bằng 2.852.069.224, tổng cột Budget phải bằng 2.705.000.000 (khớp tuần 2). Tuần 10 sẽ làm việc này bằng mô hình dữ liệu thay vì Merge.
5. Tự đánh giá
- Tôi ghi lại số dòng, tổng Nợ, tổng Có trước và sau mỗi bước Merge
- Tôi giải thích được vì sao MKT làm tăng 265 dòng và 6417 làm tăng 36 dòng
- Tôi biết vì sao kiểm tra Nợ = Có không bắt được lỗi nhân dòng
- Query PL_2025 của tôi khớp từng dòng P&L năm 2025
- Tôi phân biệt được mồ côi thật với dữ liệu nằm ngoài phạm vi bảng tra cứu