Tuần 3 · Ngày 12 · Bài mới · 4 giờ
Mục tiêu
- Dùng Left Anti / Right Anti để tìm dữ liệu "mồ côi" và ngoại lệ
- Hiểu bảng mapping tài khoản → chỉ tiêu P&L và vì sao FP&A cần nó
- Biết tài khoản loại 6 nào lên thẳng P&L, tài khoản nào đi qua giá thành
- Ghép mã giữa hai phần mềm bằng chuẩn hóa tên và Fuzzy Merge, lưu thành bảng mapping cố định
Dữ liệu cần tải
Ngày 12: Left Anti, Fuzzy Merge và bảng mapping
Kế hoạch 4 giờ
| Thời gian | Nội dung |
|---|---|
| Giờ 1 | Phần 1 - 2: bảng mapping, tài khoản nào lên P&L |
| Giờ 2 | Phần 3: tìm tài khoản chưa map bằng Left Anti |
| Giờ 3 | Phần 4: ghép mã NPP giữa phần mềm kế toán và phần mềm bán hàng |
| Giờ 4 | Bài tập |
Dùng tiếp file SaoMai_TaiChinh.pbix có query SoCai (10.311 dòng) của hôm qua.
1. Bảng mapping là gì, vì sao FP&A cần nó?
Sổ cái ghi theo tài khoản (hàng trăm mã chi tiết). Báo cáo P&L lại trình bày theo chỉ tiêu (vài chục dòng: doanh thu, giá vốn, chi phí bán hàng…). Cầu nối giữa hai bên là bảng mapping: mỗi tài khoản được gán vào một chỉ tiêu.
| Mã TK | Mã số | Chỉ tiêu P&L |
|---|---|---|
| 5111 | 01 | Doanh thu bán hàng và cung cấp dịch vụ |
| 5211 | 02 | Các khoản giảm trừ doanh thu |
| 632 | 11 | Giá vốn hàng bán |
| 6411 | 25 | Chi phí bán hàng |
| 6421 | 26 | Chi phí quản lý doanh nghiệp |
| … | … | … |
Mã số là số thứ tự dòng trên mẫu B02-DN của Thông tư 200 (học kỹ ở ngày 7 tuần này).
Trong thực tế, bảng mapping do FP&A hoặc kế toán tổng hợp giữ, thường là một file Excel. Mỗi khi kế toán mở tài khoản mới, bảng mapping phải được cập nhật. Nếu quên, các khoản phát sinh trên tài khoản mới không lên báo cáo, và không ai biết, vì Power BI không báo lỗi. Hôm nay vk iu học cách tự phát hiện.
2. Tài khoản nào lên thẳng P&L?
Không phải tài khoản loại 5 - 8 nào cũng có một dòng riêng trên P&L:
| Nhóm tài khoản | Lên P&L? | Giải thích |
|---|---|---|
| 511, 515, 521, 632, 635, 641, 642, 711, 811, 821 | Có | Mỗi tài khoản thuộc một chỉ tiêu |
| 621, 622, 627 (chi phí sản xuất) | Không trực tiếp | Đây là chi phí làm ra sản phẩm: nguyên vật liệu, lương công nhân, điện nhà máy, khấu hao máy. Cuối tháng chúng được kết chuyển vào 154 (sản phẩm dở dang), rồi thành 155 (thành phẩm trong kho). Chỉ khi hàng được bán, giá trị đó mới thành 632 giá vốn trên P&L |
| 911 | Không | Chỉ dùng để kết chuyển cuối kỳ |
Nói cách khác: tiền lương công nhân tháng 3 chưa phải chi phí của tháng 3. Nó nằm trong giá trị thùng hàng đang trong kho, và chỉ thành chi phí (giá vốn) khi thùng hàng đó được bán. Đây là nguyên tắc phù hợp của kế toán: chi phí ghi nhận cùng kỳ với doanh thu mà nó tạo ra.
3. Thực hành: tìm tài khoản chưa có trong mapping
3.1 Chuẩn bị
- Nạp
Mapping_TaiKhoan_PL.xlsx, sheet Mapping. Đặt kiểu Mã TK = Text. Đặt tên query MappingPL. - Từ SoCai, tạo query Reference đặt tên SoCai_PL:
- Lọc SoCT không bắt đầu bằng
KC(Text Filters > Does Not Begin With). - Thêm cột Loai = ký tự đầu của MaTK, giữ các dòng Loai là 5, 6, 7, 8.
- Group By theo MaTK: Sum No, Sum Co. Thêm cột PhatSinhRong = No − Co.
- Lọc SoCT không bắt đầu bằng
3.2 Left Anti
- Chọn SoCai_PL > Merge Queries as New. Trên: SoCai_PL (cột MaTK). Dưới: MappingPL (cột Mã TK). Join Kind: Left Anti (rows only in first).
- Đặt tên query mới TK_ChuaMap.
Kết quả: 11 tài khoản có phát sinh năm 2025 nhưng không có trong mapping:
| Mã TK | Phát sinh ròng (Nợ − Có) | Xử lý |
|---|---|---|
| 621 | 20.217.211.088 | Bỏ: chi phí sản xuất, đã nằm trong giá vốn |
| 622 | 4.191.837.500 | Bỏ: như trên |
| 6271 | 905.550.606 | Bỏ: như trên |
| 6272 | 116.724.769 | Bỏ: như trên |
| 6274 | 1.994.558.340 | Bỏ: như trên |
| 6277 | 1.132.353.004 | Bỏ: như trên |
| 6278 | 118.976.000 | Bỏ: như trên |
| 5212 | 59.682.102 | Thêm vào mapping: mã số 02, giảm trừ doanh thu (hàng bán bị trả lại) |
| 64281 | 123.778.649 | Thêm vào mapping: mã số 26, chi phí quản lý (tài khoản mới mở từ 1/2025) |
| 711 | −125.000.000 | Thêm vào mapping: mã số 31, thu nhập khác (bán thanh lý xe tải) |
| 811 | 13.062.469 | Thêm vào mapping: mã số 32, chi phí khác (giá trị còn lại của xe thanh lý) |
Phát sinh ròng âm nghĩa là dư Có: 711 là thu nhập.
3.3 Đánh giá mức độ ảnh hưởng
Nếu dùng mapping này lập P&L bằng Merge Inner, 4 tài khoản cuối biến mất:
| Tài khoản bị sót | Ảnh hưởng đến lợi nhuận trước thuế |
|---|---|
| 5212 hàng bán bị trả lại | Lợi nhuận bị cao hơn 59.682.102 |
| 64281 chi phí tiếp khách | Cao hơn 123.778.649 |
| 711 thu nhập khác | Thấp hơn 125.000.000 |
| 811 chi phí khác | Cao hơn 13.062.469 |
| Cộng | Cao hơn 71.523.220 |
Con số không lớn so với lợi nhuận, nhưng sai ở từng dòng: chi phí quản lý thiếu 124 triệu, và dòng thu nhập khác hoàn toàn không có. Kiểm toán sẽ phát hiện ngay.
Cách làm đúng: thêm 4 dòng vào file mapping (không sửa trong Power Query, vì mapping là dữ liệu nguồn do người khác cũng dùng), rồi Refresh. Chạy lại Left Anti: chỉ còn 7 tài khoản 621, 622, 627x. Có thể thêm một cột “Bỏ qua” trong mapping cho các tài khoản này để Left Anti trả về bảng trống khi mọi thứ ổn.
4. Thực hành: ghép mã NPP giữa hai phần mềm
4.1 Vấn đề
Phần mềm bán hàng gọi NPP bằng mã NPP01 … NPP18, tên kiểu NPP Phú Thịnh. Phần mềm kế toán gọi khách hàng bằng mã KH101 … KH118, tên pháp nhân kiểu Công ty TNHH Thương mại Phú Thịnh. Hai hệ thống không có cột mã chung, và thứ tự mã cũng không giống nhau.
Muốn đối chiếu doanh thu sổ cái với sell-in theo từng NPP, hay sau này ghép công nợ với doanh số, vk iu cần một bảng mapping KH ↔ NPP.
4.2 Chuẩn hóa tên rồi Merge chính xác
- Nạp
DanhMucKhachHang_KeToan.xlsx(query KH_KeToan) vàdata/goc/DimNPP.csv(query DimNPP). - Ở KH_KeToan, thêm cột TenChuan từ Tên khách hàng:
- Format > lowercase.
- Replace Values lần lượt các cụm sau thành rỗng:
công ty,cty,tnhh,cp,thương mại,phân phối,tm,dv. - Trim, và Replace hai khoảng trắng thành một.
- Ở DimNPP, thêm cột TenChuan từ TenNPP: lowercase, bỏ
npp, Trim. - Merge KH_KeToan (TenChuan) với DimNPP (TenChuan), Left Outer.
Kết quả: 8 / 18 khách hàng khớp ngay (Phú Thịnh, Hoàng Long, Minh Phát, Hải Đăng, Sông Hàn, Phương Nam, Gia Phát, Thuận An). 10 khách hàng không khớp vì tên kế toán có thêm tên tỉnh (thành công hải phòng, hưng thịnh đà nẵng…) hoặc viết khác (mê kông xanh so với mekong xanh).
4.3 Fuzzy Merge
- Làm lại Merge (vẫn dùng cột TenChuan ở cả 2 bảng), tick Use fuzzy matching to perform the merge.
- Mở Fuzzy matching options: Similarity threshold 0,5; tick Ignore case, Match by combining text parts; Maximum number of matches = 1 (chỉ lấy cặp giống nhất, tránh một khách hàng ghép với nhiều NPP).
- Mở rộng cột, thêm cả MaNPP và TenNPP để kiểm tra bằng mắt từng cặp.
Power Query đo độ giống bằng chỉ số Jaccard (phần chung chia phần hợp). Ước tính trên 18 tên đã chuẩn hóa:
| Nhóm | Ví dụ | Độ giống ước tính với tên đúng | Ở ngưỡng 0,5 |
|---|---|---|---|
| 8 tên trùng hẳn | phú thịnh – phú thịnh | 1,0 | Khớp (đã khớp ở 4.2) |
| Tên kế toán thêm tên tỉnh 1 - 2 chữ | đại phúc huế, hưng thịnh đà nẵng, hòa bình an giang, thành công hải phòng | 0,5 - 0,67 | Khớp đúng |
| Tên thêm tên tỉnh dài | an khang bắc ninh, tây đô cần thơ, kim ngân sài gòn, tân tiến nghệ an, biển xanh khánh hòa | 0,4 - 0,5 | Sát ngưỡng, có thể khớp hoặc không |
| Viết khác hẳn | mê kông xanh – mekong xanh | khoảng 0,25 - 0,4 | Gần như chắc chắn không khớp |
Vì các con số trên là ước tính (cách Power Query tách chữ và chấm điểm có chi tiết riêng), kết quả trên máy vk iu có thể chênh 1 - 3 tên. Điều quan trọng là quy trình: Fuzzy chỉ là công cụ gợi ý. Ngưỡng thấp dễ ghép nhầm, ngưỡng cao lại bỏ sót. Tên nào chưa khớp thì tra tay (ví dụ theo tỉnh/thành, mã số thuế), và không bao giờ dùng thẳng kết quả Fuzzy làm báo cáo.
4.4 Lưu thành bảng mapping cố định
Sau khi kiểm tra, chép kết quả ra một bảng mapping 2 cột (Excel hoặc Enter Data trong Power BI), dùng cho mọi báo cáo về sau:
| MaKH (kế toán) | MaNPP (bán hàng) | MaKH | MaNPP |
|---|---|---|---|
| KH101 | NPP13 | KH110 | NPP15 |
| KH102 | NPP16 | KH111 | NPP03 |
| KH103 | NPP02 | KH112 | NPP12 |
| KH104 | NPP05 | KH113 | NPP10 |
| KH105 | NPP11 | KH114 | NPP01 |
| KH106 | NPP08 | KH115 | NPP04 |
| KH107 | NPP06 | KH116 | NPP14 |
| KH108 | NPP18 | KH117 | NPP07 |
| KH109 | NPP09 | KH118 | NPP17 |
Kiểm tra bảng mapping: đủ 18 dòng, không mã nào lặp ở cả hai cột (Group By mỗi cột, đếm phải ra 1). Mapping lặp sẽ làm nhân dòng khi Merge (ngày 4).
Trong file dữ liệu gốc, data/goc/tai-chinh/DimDoiTuong.csv đã có sẵn cột MaNPP cho khách hàng. Thực tế hiếm khi may mắn như vậy, nên kỹ năng hôm nay rất đáng giá.
5. Bài tập tự làm
Cập nhật mapping và chạy lại (thời gian gợi ý: 25 phút)
- Lưu bản sao
Mapping_TaiKhoan_PL.xlsx, thêm 4 dòng cho 5212, 64281, 711, 811 với đúng mã số và chỉ tiêu. - Thêm cột BoQua = “x” cho 621, 622, 6271, 6272, 6274, 6277, 6278 (thêm 7 dòng mới, mã số để trống).
- Đổi nguồn query MappingPL sang file mới, Refresh. Query TK_ChuaMap còn bao nhiêu dòng?
- Bảng mapping hiện có một lỗi khác chưa được Left Anti phát hiện. Group By MappingPL theo Mã TK, đếm số dòng. Tài khoản nào xuất hiện 2 lần?
- TK_ChuaMap còn 0 dòng.
- Tài khoản 6417 có 2 dòng: một dòng mã số 25 (chi phí bán hàng), một dòng mã số 26 (chi phí quản lý). Theo phòng ban sử dụng (KHO, KD-T) và nội dung (cước vận chuyển hàng bán), 6417 thuộc chi phí bán hàng: xóa dòng mã số 26.
Left Anti chỉ tìm mã thiếu, không tìm mã thừa / trùng. Vì vậy cần thêm một kiểm tra: Group By bảng mapping theo khóa, lọc Count > 1, kết quả phải trống. Ngày 4 sẽ thấy lỗi trùng này làm chi phí bị nhân đôi ra sao.
Right Anti: tài khoản không phát sinh (thời gian gợi ý: 15 phút)
Tìm các tài khoản có trong DimTaiKhoan (hôm qua) nhưng năm 2025 không có dòng nào trên SoCai. Có tài khoản nào đáng ngạc nhiên không?
Merge SoCai (đã Group By theo MaTK) với DimTaiKhoan bằng Right Anti, hoặc DimTaiKhoan với SoCai bằng Left Anti. Kết quả gồm:
- Các tài khoản cha có tài khoản con (111, 112, 133, 211, 214, 333, 334, 338, 341, 411, 421, 511, 521, 627, 641, 642, 821…): kế toán chỉ ghi vào tài khoản chi tiết, không ghi vào tài khoản cha. Đây là điều bình thường.
- Một số tài khoản chi tiết chưa dùng năm 2025: 1122 (tiền gửi ngoại tệ), 1388, 141, 153, 2111, 2112 (năm 2025 không mua nhà xưởng, máy móc mới), 221, 3388, 4111 (không góp thêm vốn), 413, 5112, 5113, 5213, 6413, 6422.
Không có gì bất thường. Nhưng nếu thấy, ví dụ, 5111 không phát sinh trong tháng, đó là dấu hiệu dữ liệu bị thiếu.
Doanh thu: kiểm tra bảng mapping KH ↔ NPP (thời gian gợi ý: 35 phút)
- Tạo bảng mapping KH ↔ NPP bằng Enter Data theo bảng ở mục 4.4 (hoặc từ kết quả Fuzzy đã kiểm tra).
- Kiểm tra: (a) đủ 18 dòng; (b) không mã nào lặp; (c) Left Anti từ SoCai (lọc MaDoiTuong bắt đầu bằng
KH) sang bảng mapping trả về 0 dòng. - Trước khi có bảng mapping, nếu chỉ dùng Fuzzy với ngưỡng 0,3, vk iu nghĩ sẽ có rủi ro gì? Thử và quan sát.
-
(a) 18 dòng. (b) Group By theo MaKH và theo MaNPP, Count đều bằng 1. (c) Left Anti trả về 0 dòng: mọi mã khách hàng trên sổ cái đều có trong mapping.
-
Ở ngưỡng 0,3, nhiều tên ngắn đạt điểm trên 0,3 với cả NPP khác: ví dụ
phú thịnhgiốnghưng thịnhkhoảng 0,33 - 0,36,gia phátgiốngminh phátkhoảng 0,3. Nếu không đặt Maximum number of matches = 1, một khách hàng bị ghép với 2 - 3 NPP, Merge sinh thêm dòng và doanh thu bị nhân lên. Nếu có đặt bằng 1, vẫn có nguy cơ ghép nhầm sang NPP khác mà tổng vẫn trông đúng. Đó là lý do phải kiểm tra từng cặp và lưu thành bảng mapping cố định.
6. Tự đánh giá
- Tôi giải thích được vì sao 621, 622, 627 không lên thẳng P&L
- Tôi dùng Left Anti tìm được 11 tài khoản chưa map và biết xử lý từng loại
- Tôi biết Left Anti không phát hiện được mapping bị trùng, và biết cách kiểm tra trùng
- Tôi ghép được mã giữa 2 phần mềm bằng chuẩn hóa tên và Fuzzy Merge, rồi lưu thành bảng mapping