Cách dùng lệnh PIVOT, UNION và UNION ALL khi truy vấn SQL trong Excel
Hướng dẫn kỹ thuật gộp dữ liệu đa bảng theo chiều dọc bằng toán tử UNION / UNION ALL và xoay bảng tổng hợp chéo (Cross-tab) bằng câu lệnh TRANSFORM ... PIVOT trong SQL Excel VBA.

1.Union/Union all
Chức năng: lấy và kết nối dữ(nối) liệu từ nhiều bảng, nhiều file theo chiều dọc với cấu trúc tương tự cấu trúc bảng đầu tiên, các bảng tiếp theo sẽ được nối tiếp sau bảng đầu tiên, các trường(cột) được nối bằng cách xác định thứ tự và không quan tâm đến tên cột.
▪ UNION: không trùng lắp dữ liệu (nếu có trùng thì chỉ lấy 01 lần) – giống DISTINCT
▪ UNION ALL: kể cả trùng lắp dữ liệu (nếu trùng vẫn lấy)
Cú pháp:
+ Union:
SELECT col_name(s) FROM table1
UNION
SELECT col_name(s) FROM table2;
+ Union all:
SELECT col_name(s) FROM table1
UNION ALL
SELECT col_name(s) FROM table2;
2. Pivot
Chức năng: tính Pivot tương tự trên Excel, có điểm advance hơn là tránh bị sai sót grand total như trên Pivot của Excel.
Cú pháp:
TRANSFORM Calculated_field
SELECT Cols FROM Table_name
GROUP BY Cols PIVOT Col_name
|
TRANSFORM Hàm_tính_toán (Tên Cột) |
Kết quả hàm này sẽ hiển thị theo chiều ngang – là data chính của Pivot |
|
SELECT tên_cột(s), hàm_tính_toán (tên cột) |
Tên cột có data cần hiển thị theo chiều dọc. Hàm tính toán có thể có hoặc không Nếu muốn hiện kết quả tổng thì dùng hàm tính toán(tên cột) trùng với hàm đã dùng ở TRANSFORM |
|
FROM [tên bảng] |
|
|
GROUP BY tên_cột(s) |
SELECT bao nhiêu cột thì phải GROUP BY bấy nhiêu cột |
|
PIVOT tên_cột |
Data của Tên cột sẽ trở thành Header hàng ngang của bản Pivot |
Mẹo Tối ưu Truy vấn SQL trong Excel VBA & Xử lý Lỗi Thường gặp
Khi triển khai câu lệnh truy vấn SQL thông qua kết nối ADODB.Connection trên nền tảng Microsoft Excel, bạn cần lưu ý 3 quy tắc vàng sau để đảm bảo tốc độ và độ chính xác tuyệt đối:
'' Chuỗi kết nối chuẩn hỗ trợ cả cột trộn kiểu dữ liệu Số và Văn bản (IMEX=1):
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & filePath & _
";Extended Properties=""Excel 12.0 Xml;HDR=YES;IMEX=1"";"
'' Quy tắc bọc tên Sheet và tên Cột có khoảng trắng hoặc tiếng Việt:
strSQL = "SELECT [Mã Hàng], [Tên Sản Phẩm], SUM([Thành Tiền]) AS TongTien " & _
"FROM [Data_BanHang$A1:G50000] " & _
"WHERE [Thành Tiền] IS NOT NULL " & _
"GROUP BY [Mã Hàng], [Tên Sản Phẩm]"
- Luôn thêm tham số
IMEX=1: Giúp trình điều khiển OLEDB không tự ý biến các mã hàng vừa có số vừa có chữ thành giá trịNull. - Giới hạn vùng dữ liệu khi Sheet có định dạng thừa: Thay vì gọi
[Sheet1$], bạn có thể chỉ định rõ[Sheet1$A1:Z50000]để bỏ qua các dòng rác cuối bảng. - Đóng kết nối sau khi
CopyFromRecordset: Luôn gọirs.Closevàcn.Closeđể giải phóng bộ nhớ RAM và tránh khóa file nguồn.
Bài viết liên quan
Thông báo
© 2021 CÔNG TY TNHH ERX VIỆT NAM
Địa chỉ văn phòng: 46/4 Nguyễn Cửu Vân, Phường 17, Quận Bình Thạnh, TP.HCM
share
tweet