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 gianNội dung
Giờ 1Phần 1 - 2: bảng mapping, tài khoản nào lên P&L
Giờ 2Phần 3: tìm tài khoản chưa map bằng Left Anti
Giờ 3Phầ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ờ 4Bà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ã TKMã sốChỉ tiêu P&L
511101Doanh thu bán hàng và cung cấp dịch vụ
521102Các khoản giảm trừ doanh thu
63211Giá vốn hàng bán
641125Chi phí bán hàng
642126Chi 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ảnLên P&L?Giải thích
511, 515, 521, 632, 635, 641, 642, 711, 811, 821Có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
911KhôngChỉ 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ị

  1. Nạp Mapping_TaiKhoan_PL.xlsx, sheet Mapping. Đặt kiểu Mã TK = Text. Đặt tên query MappingPL.
  2. 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.

3.2 Left Anti

  1. 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).
  2. Đặ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ã TKPhát sinh ròng (Nợ − Có)Xử lý
62120.217.211.088Bỏ: chi phí sản xuất, đã nằm trong giá vốn
6224.191.837.500Bỏ: như trên
6271905.550.606Bỏ: như trên
6272116.724.769Bỏ: như trên
62741.994.558.340Bỏ: như trên
62771.132.353.004Bỏ: như trên
6278118.976.000Bỏ: như trên
521259.682.102Thêm vào mapping: mã số 02, giảm trừ doanh thu (hàng bán bị trả lại)
64281123.778.649Thê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.000Thêm vào mapping: mã số 31, thu nhập khác (bán thanh lý xe tải)
81113.062.469Thê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ạiLợi nhuận bị cao hơn 59.682.102
64281 chi phí tiếp kháchCao hơn 123.778.649
711 thu nhập khácThấp hơn 125.000.000
811 chi phí khácCao hơn 13.062.469
CộngCao 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

  1. Nạp DanhMucKhachHang_KeToan.xlsx (query KH_KeToan) và data/goc/DimNPP.csv (query DimNPP).
  2. Ở 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.
  3. Ở DimNPP, thêm cột TenChuan từ TenNPP: lowercase, bỏ npp , Trim.
  4. 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

  1. Làm lại Merge (vẫn dùng cột TenChuan ở cả 2 bảng), tick Use fuzzy matching to perform the merge.
  2. 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).
  3. 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ómVí dụĐộ giống ước tính với tên đúngỞ ngưỡng 0,5
8 tên trùng hẳnphú thịnh – phú thịnh1,0Khớ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òng0,5 - 0,67Khớp đúng
Tên thêm tên tỉnh dàian 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òa0,4 - 0,5Sát ngưỡng, có thể khớp hoặc không
Viết khác hẳnmê kông xanh – mekong xanhkhoảng 0,25 - 0,4Gầ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)MaKHMaNPP
KH101NPP13KH110NPP15
KH102NPP16KH111NPP03
KH103NPP02KH112NPP12
KH104NPP05KH113NPP10
KH105NPP11KH114NPP01
KH106NPP08KH115NPP04
KH107NPP06KH116NPP14
KH108NPP18KH117NPP07
KH109NPP09KH118NPP17

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)

  1. 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.
  2. 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).
  3. Đổi nguồn query MappingPL sang file mới, Refresh. Query TK_ChuaMap còn bao nhiêu dòng?
  4. 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?
  1. TK_ChuaMap còn 0 dòng.
  2. 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)

  1. 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).
  2. 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.
  3. 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.
  1. (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.

  2. Ở 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ịnh giống hưng thịnh khoảng 0,33 - 0,36, gia phát giống minh phát khoả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

Gửi ticket