Tổng hợp dữ liệu từ nhiều sheet

Liên hệ QC

maixuanvuong276

Thành viên mới
Tham gia
28/8/13
Bài viết
31
Được thích
3
Giới tính
Nam
Nghề nghiệp
Human
Nhờ các cao nhân giúp mình gộp dữ liệu từ sheet 1 sang sheet 2, các SP trùng nhau thì cộng dồn lại, kq mong muốn như sheet2 trong file. Chân thành cảmơnạ!
 

File đính kèm

  • Data.xlsm
    13.9 KB · Đọc: 24
Theo tôi thì không so sánh ADO và Power Query (PQ) được vì cách thức hoạt động, chức năng nó khác nhau mặc dù có công đoạn nào đó giống nhau như: kết nối CSDL.
- PQ thì lấy dữ liệu và tích hợp sẳn công cụ phân tích xử lý rất mạnh. Nói chung là làm trọn gói.
- Còn đối với ADO (như cách tôi thường làm) là một lớp trung gian để kết nối với các loại CSDL, thực thi các câu lệnh SQL. Vấn đề là ở việc xử lý các câu lệnh SQL: nếu thực thi hoàn toàn các câu lệnh SQL từ ADO thì tôi chắc chắn không đủ để tổng hợp, truy vấn, phân tích dữ liệu đáp ứng yêu cầu được. Đối với CSDL Access, tôi phải tận dụng sức mạnh Query của nó để tổng hợp ra dữ liệu mình cần, đối với CSDL SQL Server thì viết các store proc, hàm để chạy truy vấn trực tiếp trên Server và ADO chỉ làm cầu nối, gửi các tham số, yêu cầu SQL Server thực thi rồi lấy kết quả về thôi.
Nói tóm lại để kết nối dữ liệu, thực hiện các truy vấn cơ bản thì ADO làm được nhưng chuyên sâu xử lý thì không. Ngược lại thì PQ nó làm được điều này. Nói thực là tôi chỉ biết PQ ở mức cơ bản nhưng chỉ cần đọc tài liệu là có thể hiểu được khả năng của nó.
Như trên em có nói là em không rành về ADO. Nên em hỏi anh chút. Giả sử dữ liệu 15 ngày đã > 1.2 tr record. Thì ADO có thể collect và group by lại theo các tiêu chí được không anh?
Bài đã được tự động gộp:

Rồi tôi hiểu tại Sao rồi. Name tôi đặt là trực tiếp trong Name Manager của Excel. Không phải Name đặt tại 1 ô trên Sheet.
Power Query nó không chịu lấy name đặt trực tiếp trong Name Manager mà không thông qua trên Range
Name đặt ở đâu cũng được chứ anh. Bản chất như nhau. Kể cả name động đi chăng nữa
 
Upvote 0
2 môi trường khác nhau, nếu viết full câu lệnh SQL (giả sử request tới SQL server) thì nó xử lý ở trên SQL server, còn đẩy raw về rồi ETL ở power query thì nó là môi trường của power query kết quả trả về là kết quả cuối cùng mặc dù gọi nhiều bảng nhưng chỉ là query chứ không lưu, còn việc xử lý thì chắc chắn môi trường ở sql server sẽ nhanh hơn power query rồi, còn so với môi trường xử lý khác như Access, ODBC tới database của Foxpro thì không chắc Power query thua đâu khi cần clean data ở dạng nhiều,với SQL server thì connect Power query full SLQ sẽ ngon hơn mà thực tế là vậy người ta sẽ viết thẳng cái code rồi gửi request connect luôn, PQ cho phép điều gửi code lập trình SQL thẳng để request, không biết ADO có làm được điều này không tôi đã thử sử dụng tạo bảng tạm và tính toán trên bảng tạm đó để lấy dữ liệu mong muốn bằng ADO nhưng không connect được chưa kể đến loop, ví dụ với câu đơn giản như vầy ADO sẽ báo lỗi, nếu mà không request được dạng này mà chỉ là mấy câu select bình thường ADO thì không thể so ETL được với power queryView attachment 265871

Theo như hình của bạn thì thấy PQ nó dùng luôn cú pháp của SQL Server để viết và gửi lệnh luôn, vậy thì tiện nhỉ.
Đối với ADO, muốn thực hiện câu lệnh trên (câu lệnh SQL cơ bản) thì dùng ADO Command và cung cấp parameter @date, @Year thì cũng lấy dữ liệu về được nhé.
 
Upvote 0
Theo như hình của bạn thì thấy PQ nó dùng luôn cú pháp của SQL Server để viết và gửi lệnh luôn, vậy thì tiện nhỉ.
Đối với ADO, muốn thực hiện câu lệnh trên (câu lệnh SQL cơ bản) thì dùng ADO Command và cung cấp parameter @date, @Year thì cũng lấy dữ liệu về được nhé.
Ah, ý tôi hỏi là câu lệnh trên nó có lưu vào bảng tạm #a1 sau đó dùng một câu select khác để gọi cái bảng tạm đó không tôi thử với ADO thì nó lỗi, ADO có thể tạo bảng tạm và gọi lại bảng tạm trong 1 lần connect không, lý do tạo bảng tạm là để tránh việc một câu select có subquery được gọi quá nhiều lần , rồi có thể gửi đoạn loop được không như while begin...end chẳng hạn?
 
Upvote 0
Bạn thử lại đi. Theo câu M của bạn thì chỉ áp dụng được Name từ Range, hay tôi không biết cách nhỉ?

fname= Excel.CurrentWorkbook(){[Name="TenFile"]}[Content]{0}[Column1] ,

Trong File có 1 Name là Source đặt trực tiếp trong Name Manager, bạn thử được không nhé
Công nhận lỗi, em cũng không hiểu? phải nhờ các tiền bối @excel_lv1.5, @ptm0412 giải thích thêm.
Như nhìn bảng NameManager thì nó đang chưa hiểu Value của cái hàm này trả về kết quả gì.

Snag_85cfc77.png
 
Upvote 0
2 môi trường khác nhau, nếu viết full câu lệnh SQL (giả sử request tới SQL server) thì nó xử lý ở trên SQL server, còn đẩy raw về rồi ETL ở power query thì nó là môi trường của power query kết quả trả về là kết quả cuối cùng mặc dù gọi nhiều bảng nhưng chỉ là query chứ không lưu,
Tôi hiểu điều này. PQ (Power query) làm đơn thuần bằng các step lệnh trên giao diện thì phải lấy về đủ các bảng sau đó thiết lập quan hệ và merge, hoặc combine. Và tôi cũng nói thêm rằng nếu không dùng combine thì dùng hàm M khác để thực hiện. Lúc này phải tự viết trong query advanced editor.
Về câu lệnh SQL lấy trực tiếp trên server, thì do tôi không có môi trường SQL server, mà chỉ có môi trường PostGreSQL nên thực hành trên đó để viết tài liệu căn bản. Trong đó tôi chỉ gõ câu lệnh SQL chuẩn bao gồm select lồng, join, groupby, thêm cột đơn giản. Thế là lấy được dữ liệu. Câu SQL đó là câu mà tôi thực hiện trên cửa sổ PostGreSQL thành công, chỉ là cần lấy về Excel để phân tích.
Ảnh sau là trang 132 của tài liệu, câu SQL không phức tạp và không nhiều bảng.

1631339533539.png
 
Upvote 0
Công nhận lỗi, em cũng không hiểu? phải nhờ các tiền bối @excel_lv1.5, @ptm0412 giải thích thêm.
Như nhìn bảng NameManager thì nó đang chưa hiểu Value của cái hàm này trả về kết quả gì.

View attachment 265877
Tôi ít sài Name để gọi giá trị ngoài worksheet, thông thường tôi sẽ convert nó thành table rồi đẩy thẳng vào power query, đỡ bước tạo Name. Còn lỗi theo tôi nghĩ là do nó không nhận là value như string hay number mà bắt buộc phải là dạng table, record (range, cell)
 
Upvote 0
Tôi ít sài Name để gọi giá trị ngoài worksheet, thông thường tôi sẽ convert nó thành table rồi đẩy thẳng vào power query, đỡ bước tạo Name. Còn lỗi theo tôi nghĩ là do nó không nhận là value như string hay number mà bắt buộc phải là dạng table, record (range, cell)
Anh convert thành table thì bản chất nó sinh ra 1 name "Table1", có tiêu đề. Còn đặt name như @Cá ngừ F1 (là làm theo tôi), không có tiêu đề. Chính vì vậy truy xuất sẽ khác nhau: Name không tiêu đề phải truy xuất "Column1" thay vì tiêu đề.

Name định nghĩa cứng trong Name manager, name động bằng hàm offset (hoặc hàm khác) sẽ không được PQ nhận dạng.
 
Upvote 0
Tôi hiểu điều này. PQ (Power query) làm đơn thuần bằng các step lệnh trên giao diện thì phải lấy về đủ các bảng sau đó thiết lập quan hệ và merge, hoặc combine. Và tôi cũng nói thêm rằng nếu không dùng combine thì dùng hàm M khác để thực hiện. Lúc này phải tự viết trong query advanced editor.
Về câu lệnh SQL lấy trực tiếp trên server, thì do tôi không có môi trường SQL server, mà chỉ có môi trường PostGreSQL nên thực hành trên đó để viết tài liệu căn bản. Trong đó tôi chỉ gõ câu lệnh SQL chuẩn bao gồm select lồng, join, groupby, thêm cột đơn giản. Thế là lấy được dữ liệu. Câu SQL đó là câu mà tôi thực hiện trên cửa sổ PostGreSQL thành công, chỉ là cần lấy về Excel để phân tích.
Ảnh sau là trang 132 của tài liệu, câu SQL không phức tạp và không nhiều bảng.

View attachment 265879
Có thể xem power query (PQ) như cái trình biên dịch, SQL server có thể code thẳng trên giao diện của power query, tôi nghĩ PostGreSQL chắc cũng vậy, việc sử dụng join cũng như merge trong PQ, thì cái này mình phải lựa chọn thôi, tôi ví dụ tôi thường làm SQL server và tôi chắc rằng là SQLserver nó sẽ xử lý nhanh hơn, nên tôi sẽ code full SQL rồi code đưa vào PQ để lấy kết quả cuối luôn, tôi cũng thường connect vào database của foxpro thông qua ODBC để lấy dữ liệu cũ và tôi cũng biết rằng nếu viết full code fox thì sẽ chậm hơn khi load data raw về PQ để transform nên tôi sẽ chọn load về rồi xử lý bằng PQ, vì vậy tôi nghĩ tốc độ xử lý của cái nào ngon hơn thì chọn cái đó thôi, cả 2 đề thực hiện được trên cả PQ, nếu không tính M code thì việc transform bằng những thứ có sẵn trên thanh công cụ PQ thực tế là đơn giản hơn việc ngồi viết full code connect
Bài đã được tự động gộp:

Anh convert thành table thì bản chất nó sinh ra 1 name "Table1", có tiêu đề. Còn đặt name như @Cá ngừ F1 (là làm theo tôi), không có tiêu đề. Chính vì vậy truy xuất sẽ khác nhau: Name không tiêu đề phải truy xuất "Column1" thay vì tiêu đề.

Name định nghĩa cứng trong Name manager, name động bằng hàm offset (hoặc hàm khác) sẽ không được PQ nhận dạng.
Không phải bạn, nó là table đó bạn tại vì cái bước đó nó bỏ qua bước trả về table mà nó trả về giá trị cuối của table thôi, offset trả về range vẫn nhận, chỉ có dạng value là không 1631340790234.png
 
Lần chỉnh sửa cuối:
Upvote 0
Như trên em có nói là em không rành về ADO. Nên em hỏi anh chút. Giả sử dữ liệu 15 ngày đã > 1.2 tr record. Thì ADO có thể collect và group by lại theo các tiêu chí được không anh?
- Group by là do cách viết câu lệnh SQL thôi bạn. Tính toán Sum, Count, Average, Min, Max là nhưng cái mặc định trong Group by (Total Query).
- Tổng hợp dữ liệu 1,2 triệu dòng thì ADO làm được nhưng nhanh chậm thì lại đi vào việc so sánh tốc độ lấy dữ liệu. Vừa rồi có bài đề cập rồi đó: ADODB, PQ, Python...
Theo cách tôi làm, không bao giờ dính chết vào một loại công cụ nào đó, qui mô dữ liệu tới đâu mình lựa chọn công cụ phù hợp với nó, nếu ADO chạy ì ạch quá thì tìm cái khác xem có tối ưu hơn không và phù hợp với hệ sinh thái thiết kế của bạn. Vd: Excel giới hạn dòng thì dùng Access làm database; Khi Ms Access database hết 2G dữ liệu thì mình dùng SQL Server làm Back end, dùng Access để thiết kế giao diện Font end thôi. Và đối với tôi ADO chỉ làm cầu nối thôi chứ không dùng thuần ADO để truy vấn dữ liệu (chỉ dùng cho các câu lệnh SQL đơn giản). Dùng tài nguyên máy chủ SQL Server để tổng hợp dữ liệu, dùng tài nguyên máy khách để thực hiện kết nối ADO, tải dữ liệu về.
Các ngôn ngữ xuất hiện để đáp ứng một nhu cầu nào đó và tất nhiên nó sẽ có điểm mạnh ở một phân khúc nào đó, nếu mình có khả năng và cũng đang lập trình ở phân khúc đó thì nên học hỏi thêm để cải tiến. Như tôi hiện giờ, thì khả năng học thêm nữa không cao nên chỉ làm những cái ứng dụng phù hợp với ngôn ngữ mà mình biết mà nó vẫn còn chạy tốt, chứ còn nói tới Big Data, Data Science mà cứ VBA là chết toi. :D
Bài đã được tự động gộp:

Ah, ý tôi hỏi là câu lệnh trên nó có lưu vào bảng tạm #a1 sau đó dùng một câu select khác để gọi cái bảng tạm đó không tôi thử với ADO thì nó lỗi, ADO có thể tạo bảng tạm và gọi lại bảng tạm trong 1 lần connect không, lý do tạo bảng tạm là để tránh việc một câu select có subquery được gọi quá nhiều lần , rồi có thể gửi đoạn loop được không như while begin...end chẳng hạn?

ADO thì không tự tạo bảng tạm #tempTable trên SQLServer rồi bạn. Như tôi đã nói ADO chạy câu lệnh SQL cơ bản, việc tạo bảng tạm thì ADO chỉ có thể gọi thực thi hàm, thủ tục nội tại trên SQL Server thực hiện thôi.
 
Lần chỉnh sửa cuối:
Upvote 0
Không phải bạn, nó là table đó bạn tại vì cái bước đó nó bỏ qua bước trả về table mà nó trả về giá trị cuối của table thôi, offset trả về range vẫn nhận, chỉ có dạng value là không
Khi Name là 1 giá trị đơn ở 1 ô trên sheet, tôi biết rằng đó là table, tôi chỉ nói rằng nó là table không tiêu đề, và bị gán tiêu đề là Column1. Khi truy xuất nó là cú pháp truy xuất table, tên field là Column1, record 0
Và tôi mới test, name động trả về Range vẫn được nhận dạng như bạn bảo. Chắc tôi nhớ nhầm trong 1 trường hợp đạc biệt nào đó.

1631350844253.png
 
Upvote 0
Tôi ít sài Name để gọi giá trị ngoài worksheet, thông thường tôi sẽ convert nó thành table rồi đẩy thẳng vào power query, đỡ bước tạo Name. Còn lỗi theo tôi nghĩ là do nó không nhận là value như string hay number mà bắt buộc phải là dạng table, record (range, cell)
Hi anh,
Nếu anh convert nguồn thành table và đẩy vào query, cụ thể như file ở bài #46 của @hpkhuong, thì để lấy dữ liệu thì phải tạo parameter và invoke function hả anh?
 
Upvote 0
Hi anh,
Nếu anh convert nguồn thành table và đẩy vào query, cụ thể như file ở bài #46 của @hpkhuong, thì để lấy dữ liệu thì phải tạo parameter và invoke function hả anh?
Giả sử tên file tạo thành 1 table 1 dòng 1 cột ở I1:I2, tiêu đề là "tên file", thì cũng truy xuất record 0, field là [Tên file]

1631374542989.png

Nếu bảng 2 cột, 3 cột thì truy xuất theo tên field
Nếu bảng 2 dòng, 3 dòng, thì truy xuất theo record 1, record 2 (do bắt đầu từ 0)
 
Upvote 0
Giả sử tên file tạo thành 1 table 1 dòng 1 cột ở I1:I2, tiêu đề là "tên file", thì cũng truy xuất record 0, field là [Tên file]

View attachment 265911

Nếu bảng 2 cột, 3 cột thì truy xuất theo tên field
Nếu bảng 2 dòng, 3 dòng, thì truy xuất theo record 1, record 2 (do bắt đầu từ 0)
Ổn rồi ạ.
Mà có thể anh @excel_lv1.5 có thêm cách khác. Vì anh có đẩy cái table vào query để làm tham chiếu.
 
Upvote 0
Upvote 0
Rất xin lỗi thành viên @maixuanvuong276 vì có những trao đổi hơi nhiều về Topic này, thực tế cũng muốn có một giải pháp tốt hơn về việc tổng hợp này của bạn.
Tôi thử làm lại bằng Power Query.
Bản giải nén File đính kèm về máy (để File TongHop và folder Source tại cùng 1 thư mục).
Giả sử các dữ liệu bạn cần phải tổng hợp ở trong Source (tôi có tạo 4 file Data như cấu trúc bạn gửi ở bài #1), tôi nghĩ rằng các file dữ liệu này cần tách hẳn ra thành File riêng, còn lúc tổng hợp sẽ làm ở 1 File khác.
1. Bạn mở File TongHop
2. Ở sheet Setting, ô bôi đỏ là để chọn tương ứng các File bạn cần tổng hợp.
3. Sau khi chọn File nguồn, sang sheet TongHop, click phải chuột chọn Refresh.
 

File đính kèm

  • TongHop.rar
    60.3 KB · Đọc: 16
Upvote 0
Rất xin lỗi thành viên @maixuanvuong276 vì có những trao đổi hơi nhiều về Topic này, thực tế cũng muốn có một giải pháp tốt hơn về việc tổng hợp này của bạn.
Tôi thử làm lại bằng Power Query.
Bản giải nén File đính kèm về máy (để File TongHop và folder Source tại cùng 1 thư mục).
Giả sử các dữ liệu bạn cần phải tổng hợp ở trong Source (tôi có tạo 4 file Data như cấu trúc bạn gửi ở bài #1), tôi nghĩ rằng các file dữ liệu này cần tách hẳn ra thành File riêng, còn lúc tổng hợp sẽ làm ở 1 File khác.
1. Bạn mở File TongHop
2. Ở sheet Setting, ô bôi đỏ là để chọn tương ứng các File bạn cần tổng hợp.
3. Sau khi chọn File nguồn, sang sheet TongHop, click phải chuột chọn Refresh.
tks bạn rất nhiều!
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom