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ư 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?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ó.
Name đặt ở đâu cũng được chứ anh. Bản chất như nhau. Kể cả name động đi chăng nữaRồ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
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
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?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é.
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.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é
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.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 í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)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
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 đề.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)
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 connectTô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
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ôngAnh 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.
- 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).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?
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?
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 0Khô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
Hi anh,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)
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]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?
Ổn rồi ạ.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)
Ý tôi là vầy, chắc cũng giống bạn @ptm0412 , ví dụ có dữ liệu from date, to date, tôi sẽ convert nó thành table bấm Ctrl+T , rồi trong M tôi gọi nó ra thôiỔ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.
tks bạn rất nhiều!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.