Menu
ESC

Nhập từ khóa để tìm kiếm

↑↓ Di chuyển
Enter Mở
ESC Đóng

Đang tải...

Bài 13 — Excel → SQL: tận dụng skill cũ

Từ Finance/Kế Toán sang BA: Lộ Trình Chuyển Đổi Bài 13/60

Mở đầu — vì sao bài này quan trọng

Nếu bạn đã làm Finance hay Kế toán vài năm, có một sự thật mà ít người nói cho bạn nghe: bạn đã biết SQL từ lâu rồi, chỉ là bạn chưa gọi nó bằng cái tên đó. Mỗi lần bạn lọc một bảng dữ liệu công nợ trong Excel, bạn đang viết một câu WHERE. Mỗi lần bạn dựng một PivotTable để xem doanh thu theo từng chi nhánh, bạn đang viết GROUP BY. Mỗi lần bạn dùng VLOOKUP để kéo tên khách hàng từ sheet danh mục sang sheet hóa đơn, bạn đang viết một câu JOIN. Tư duy đã có sẵn — chỉ là cú pháp khác đi.

Đây chính là lợi thế khổng lồ của người từ Finance chuyển sang BA. Phần lớn người mới học SQL phải vật lộn với khái niệm "dữ liệu dạng bảng", "quan hệ giữa các bảng", "tổng hợp theo nhóm". Bạn thì không. Bạn đã sống trong thế giới dữ liệu dạng bảng suốt sự nghiệp của mình. Việc của bài này không phải dạy bạn một thứ hoàn toàn mới, mà là bắc một cây cầu từ thứ bạn đã thành thạo (Excel) sang thứ mà mọi BA cần (SQL).

Tại sao một BA cần SQL? Vì trong 90% dự án thực tế, khi bạn muốn hiểu nghiệp vụ thật sự đang chạy thế nào, bạn không thể chỉ ngồi nghe stakeholder kể. Bạn phải tự mở database lên, đếm xem có bao nhiêu đơn hàng bị treo trạng thái, tự tay kiểm tra dữ liệu có khớp với quy trình hay không. Một BA biết SQL là một BA không phải đi xin developer "anh ơi chạy giúp em query này" mỗi lần cần con số. Đó là sự độc lập, và nó khiến bạn đáng giá hơn rất nhiều trên thị trường.

Khái niệm cốt lõi

Bảng ánh xạ Excel → SQL

Hãy bắt đầu bằng tấm bản đồ dịch thuật giữa hai thế giới. In tấm bảng này ra, dán lên màn hình, và mỗi lần bí, hãy nhìn nó:

ExcelSQLÝ nghĩa
Workbook (file)DatabaseToàn bộ kho dữ liệu
SheetTable (bảng)Một tập dữ liệu cùng chủ đề
Cột (Column A, B...)Field / ColumnMột thuộc tính của dữ liệu
DòngRow / RecordMột bản ghi cụ thể
Ô tiêu đề cộtTên fieldĐịnh danh của cột
Filter (Auto Filter)WHERELọc dòng theo điều kiện
Sort A→ZORDER BYSắp xếp kết quả
PivotTable (Rows)GROUP BYGom nhóm để tổng hợp
SUM / COUNT / AVERAGE trong PivotSUM(), COUNT(), AVG()Hàm tổng hợp
VLOOKUP / INDEX-MATCHJOINNối hai bảng theo khóa chung
Lấy 100 dòng đầuLIMIT 100Giới hạn số dòng trả về
Remove DuplicatesDISTINCTLoại bản ghi trùng
IF lồng nhauCASE WHENLogic điều kiện
Khi bạn nhìn bảng này, bạn sẽ nhận ra: gần như mọi thao tác Excel quen thuộc đều có một câu lệnh SQL tương đương. Khác biệt lớn nhất là ở chỗ — Excel làm việc bằng thao tác chuột (bạn click, kéo, chọn), còn SQL làm việc bằng mô tả ý định (bạn viết ra điều bạn muốn, máy tự tìm cách lấy).

Giải phẫu một câu SELECT

Câu lệnh SQL phổ biến nhất, chiếm 95% công việc của một BA, là SELECT. Cấu trúc của nó luôn theo một thứ tự cố định:

SELECT   cot_can_lay          -- Bạn muốn xem cột nào? (giống chọn cột hiển thị)
FROM     ten_bang             -- Lấy từ sheet/bảng nào?
WHERE    dieu_kien_loc        -- Lọc dòng theo điều kiện gì? (giống Filter)
GROUP BY cot_gom_nhom         -- Gom nhóm theo cột nào? (giống Pivot Rows)
HAVING   dieu_kien_sau_gom    -- Lọc tiếp sau khi đã gom nhóm
ORDER BY cot_sap_xep          -- Sắp xếp theo cột nào? (giống Sort)
LIMIT    so_dong;             -- Lấy bao nhiêu dòng?

Một mẹo tư duy quan trọng: máy tính đọc câu SQL không theo thứ tự bạn viết. Bạn viết SELECT trước, nhưng máy thực thi FROM trước (mở bảng ra), rồi WHERE (lọc dòng), rồi GROUP BY (gom nhóm), rồi mới đến SELECT (chọn cột hiển thị), cuối cùng là ORDER BY (sắp xếp). Hiểu thứ tự thực thi này giúp bạn debug query khi nó ra kết quả sai.

Sự khác biệt tư duy then chốt

Trong Excel, bạn thao tác trên dữ liệu nhìn thấy được — bạn cuộn chuột, bạn thấy từng ô. Trong SQL, bạn làm việc với tập hợp (set). Bạn không nói "lấy ô C5", bạn nói "lấy tất cả những dòng thỏa điều kiện X". Đây là bước nhảy tư duy quan trọng nhất, và may mắn là PivotTable đã rèn cho bạn tư duy này rồi: khi bạn dựng Pivot, bạn cũng không quan tâm từng dòng, bạn quan tâm tổng theo nhóm.

Tình huống thực tế

Tình huống 1: Chị Hương và báo cáo công nợ tại một công ty phân phối

Chị Hương làm kế toán công nợ 6 năm tại một công ty phân phối hàng tiêu dùng ở TP.HCM, có khoảng 1.200 khách hàng đại lý. Mỗi cuối tháng, chị xuất file Excel 40.000 dòng hóa đơn, dùng AutoFilter lọc ra những hóa đơn quá hạn trên 30 ngày, rồi dựng PivotTable tính tổng công nợ quá hạn theo từng đại lý. Quy trình này tốn của chị khoảng 2 tiếng mỗi lần, và file Excel nặng đến mức máy hay treo.

Khi chuyển sang vị trí BA tại công ty, chị được giao phân tích "vì sao tỷ lệ nợ xấu tăng". Thay vì xuất Excel, chị học viết:

SELECT   ten_dai_ly,
         SUM(so_tien) AS tong_no_qua_han
FROM     hoa_don
WHERE    trang_thai = 'chua_thanh_toan'
  AND    ngay_den_han < CURRENT_DATE - INTERVAL '30 days'
GROUP BY ten_dai_ly
ORDER BY tong_no_qua_han DESC;

Diễn giải: Câu này làm đúng cái mà PivotTable của chị làm — nhưng chạy trong 2 giây thay vì 2 tiếng, và không treo máy. WHERE chính là cái Filter của chị. GROUP BY ten_dai_ly chính là việc kéo trường "Đại lý" vào Rows của Pivot. SUM(so_tien) chính là Values trong Pivot. ORDER BY ... DESC chính là Sort giảm dần để xem ai nợ nhiều nhất lên đầu.

Bài học rút ra: Chị Hương không học một kỹ năng mới — chị học một cách diễn đạt nhanh hơn cho thứ chị đã biết. Và quan trọng hơn, vì query chạy trực tiếp trên database sống, chị không còn phụ thuộc vào file xuất ra hôm qua đã cũ.

Tình huống 2: Anh Tâm tại một fintech cho vay tiêu dùng

Anh Tâm từng là chuyên viên phân tích tài chính, chuyển sang làm BA tại một công ty fintech cho vay tiêu dùng ở Hà Nội. Đội sản phẩm hỏi anh: "Trong tháng vừa rồi, có bao nhiêu khoản vay được giải ngân nhưng khách chưa từng trả góp kỳ nào?" Đây là câu hỏi cần nối hai bảng: bảng khoan_vay và bảng lich_su_tra_gop.

Trong Excel, anh sẽ dùng VLOOKUP hoặc COUNTIF chéo giữa hai sheet. Trong SQL, anh dùng JOIN:

SELECT   kv.ma_khoan_vay,
         kv.so_tien_giai_ngan
FROM     khoan_vay kv
LEFT JOIN lich_su_tra_gop tg
       ON kv.ma_khoan_vay = tg.ma_khoan_vay
WHERE    kv.ngay_giai_ngan >= '2026-05-01'
  AND    tg.ma_khoan_vay IS NULL;

Diễn giải: LEFT JOIN nghĩa là "giữ tất cả khoản vay, kể cả những khoản không tìm thấy bản ghi trả góp tương ứng". Điều kiện tg.ma_khoan_vay IS NULL lọc ra đúng những khoản vay chưa có dòng trả góp nào — tức khách chưa trả kỳ nào. Đây là một mẫu (pattern) cực kỳ phổ biến gọi là "anti-join", dùng để tìm những bản ghi bên này mà không có ở bên kia. Trong Excel, mẫu này tương đương với việc VLOOKUP trả về #N/A.

Bài học rút ra: JOIN chính là VLOOKUP được nâng cấp. Khi đã hiểu VLOOKUP nối hai sheet qua một cột chung (ví dụ mã khách hàng), bạn hiểu JOIN. Khác biệt là JOIN mạnh hơn nhiều: nối được nhiều bảng, không giới hạn dòng, và không bị lỗi khi dữ liệu lớn. Câu hỏi của đội sản phẩm tưởng phức tạp, nhưng với SQL chỉ là 7 dòng — và con số trả về giúp họ phát hiện một lỗ hổng trong quy trình nhắc nợ.

Tình huống 3: Phân khúc khách hàng bằng CASE WHEN

Một BA tại một sàn thương mại điện tử cần phân nhóm khách theo tổng chi tiêu để đội marketing chạy chương trình. Trong Excel, đây là một rừng hàm IF lồng nhau. Trong SQL, đó là CASE WHEN:

SELECT   ma_khach_hang,
         SUM(gia_tri_don) AS tong_chi_tieu,
         CASE
             WHEN SUM(gia_tri_don) >= 50000000 THEN 'VIP'
             WHEN SUM(gia_tri_don) >= 10000000 THEN 'Thân thiết'
             ELSE 'Thường'
         END AS phan_khuc
FROM     don_hang
WHERE    trang_thai = 'hoan_thanh'
GROUP BY ma_khach_hang;

Diễn giải: CASE WHEN đọc từ trên xuống, gặp điều kiện đúng đầu tiên thì dừng — y hệt cách IF lồng nhau hoạt động. Khách chi từ 50 triệu trở lên là VIP, từ 10 đến dưới 50 triệu là Thân thiết, còn lại là Thường.

Bài học rút ra: Logic phân loại nghiệp vụ mà bạn từng viết bằng IF trong Excel chuyển thẳng sang CASE WHEN. Đây cũng là cầu nối tự nhiên tới việc viết business rules — kỹ năng bạn sẽ dùng nhiều khi làm BA.

Hướng dẫn từng bước

Đây là lộ trình tự học SQL trong 2 tuần dành cho người đã giỏi Excel:

  • Cài môi trường thực hành. Dùng [SQLite Online](https://sqliteonline.com) hoặc [DB Fiddle](https://db-fiddle.com) — chạy thẳng trên trình duyệt, không cần cài gì. Nếu muốn nghiêm túc, cài PostgreSQL kèm DBeaver (công cụ giao diện miễn phí, giống Excel của thế giới database).
  • Tự tạo dữ liệu quen thuộc. Đừng học bằng bảng dữ liệu lạ. Lấy chính một file Excel công việc cũ của bạn — bảng hóa đơn, bảng công nợ — import vào, rồi tập query trên đó. Học trên dữ liệu mình hiểu nghiệp vụ thì nhanh gấp ba.
  • Bắt đầu từ SELECT ... FROM ... WHERE. Tuần đầu chỉ làm chủ ba mệnh đề này. Hãy đặt mục tiêu: dịch mọi thao tác Filter bạn từng làm trong Excel thành câu WHERE. Lọc đơn theo ngày, theo trạng thái, theo khoảng giá trị.
  • Sang GROUP BY và hàm tổng hợp. Mỗi PivotTable bạn từng dựng, hãy viết lại bằng GROUP BY. Đây là phần người Finance học nhanh nhất vì tư duy Pivot đã có.
  • Học JOIN qua lăng kính VLOOKUP. Lấy hai sheet bạn từng VLOOKUP chéo nhau, viết lại bằng INNER JOIN rồi LEFT JOIN. Hiểu khác biệt giữa hai loại join này là bước ngoặt.
  • Thêm CASE WHEN, DISTINCT, LIMIT. Những công cụ này hoàn thiện bộ kỹ năng cốt lõi.
  • Thực chiến. Xin quyền truy cập read-only vào database staging của công ty (chỉ đọc, không sửa), rồi tự trả lời những câu hỏi nghiệp vụ thật bằng SQL. Đây là lúc kỹ năng đóng đinh.

Lỗi thường gặp & mẹo

Quên rằng GROUP BY đòi mọi cột không tổng hợp phải nằm trong nó. Lỗi kinh điển: bạn viết SELECT ten_dai_ly, ma_don, SUM(so_tien) ... GROUP BY ten_dai_ly. Database báo lỗi vì ma_don không nằm trong GROUP BY và cũng không được tổng hợp. Quy tắc: trong câu có GROUP BY, mỗi cột ở SELECT hoặc là cột gom nhóm, hoặc nằm trong hàm tổng hợp như SUM/COUNT.

Nhầm WHERE với HAVING. WHERE lọc trước khi gom nhóm (lọc từng dòng), HAVING lọc sau khi gom nhóm (lọc từng nhóm). Muốn lọc "đại lý có tổng nợ trên 100 triệu" thì phải dùng HAVING SUM(so_tien) > 100000000, không phải WHERE.

Dùng INNER JOIN khi cần LEFT JOIN và mất dữ liệu mà không biết. INNER JOIN chỉ giữ những dòng khớp ở cả hai bảng. Nếu bạn muốn "tất cả khách hàng, kể cả người chưa có đơn nào", phải dùng LEFT JOIN. Đây là nguồn gốc của vô số con số sai trong báo cáo. Mẹo: luôn tự hỏi "câu hỏi của mình có cần giữ cả những dòng không khớp không?"

Bẫy NULL. Trong SQL, NULL không bằng bất cứ thứ gì, kể cả chính nó. Viết WHERE cot = NULL luôn ra rỗng. Phải dùng WHERE cot IS NULL. Người Finance hay vấp vì trong Excel ô trống xử lý khác.

Mẹo vàng: Luôn chạy thử với LIMIT 10 trước khi chạy câu nặng trên bảng triệu dòng. Và khi query ra kết quả lạ, hãy bỏ dần từng mệnh đề (xóa GROUP BY, xóa JOIN) để khoanh vùng lỗi — giống cách bạn debug một công thức Excel dài bằng cách tách từng phần.

Bài tập thực hành

Giả sử bạn có hai bảng: don_hang (cột: ma_don, ma_khach, ngay_dat, gia_tri, trang_thai) và khach_hang (cột: ma_khach, ten, thanh_pho).

  • Dịch Filter: Viết câu lấy tất cả đơn hàng có giá trị trên 5 triệu, đặt trong tháng 5/2026, trạng thái hoan_thanh.
  • Dịch Pivot: Viết câu tính tổng giá trị đơn hoàn thành theo từng thành phố, sắp xếp giảm dần. (Gợi ý: cần JOIN hai bảng rồi GROUP BY.)
  • Dịch VLOOKUP nâng cao: Tìm những khách hàng chưa từng đặt đơn nào (anti-join với LEFT JOIN + IS NULL).
  • Dịch IF lồng nhau: Phân loại mỗi đơn thành 'Lớn' (≥10 triệu), 'Vừa' (3–10 triệu), 'Nhỏ' (dưới 3 triệu) bằng CASE WHEN.
  • Thử thách: Viết câu trả lời "thành phố nào có giá trị đơn trung bình cao nhất, chỉ tính những thành phố có từ 20 đơn trở lên" (cần GROUP BY + HAVING + ORDER BY + LIMIT).
Hãy làm trên SQLite Online, và đối chiếu: với mỗi câu, tự hỏi "nếu làm việc này trong Excel, mình sẽ thao tác thế nào?". Sự đối chiếu đó chính là cách kiến thức cũ neo giữ kiến thức mới.

Tóm tắt

SQL không phải một ngôn ngữ lập trình đáng sợ — với người từ Finance, nó là Excel được viết ra bằng chữ thay vì bằng chuột. Filter là WHERE, Sort là ORDER BY, Pivot là GROUP BY cộng hàm tổng hợp, VLOOKUP là JOIN, IF lồng nhau là CASE WHEN. Mọi tư duy dữ liệu dạng bảng bạn rèn suốt nhiều năm đều chuyển thẳng sang được.

Điều khiến SQL đáng giá với một BA không phải vì nó "ngầu", mà vì nó cho bạn sự độc lập: tự tay kiểm chứng dữ liệu, tự trả lời câu hỏi nghiệp vụ, không phải chờ developer. Trong các bài sau, bạn sẽ thấy kỹ năng này nối thẳng vào việc viết business rules, dựng data model và phân tích yêu cầu. Hãy bắt đầu ngay hôm nay: mở một file Excel công việc cũ, import vào SQLite Online, và viết câu SELECT đầu tiên. Bạn sẽ ngạc nhiên vì mình đã biết nhiều đến thế nào.