Lỗi câu lệnh SQL? Không hiểu, mong các bạn giúp đỡ
Chà sau mấy ngày nâng cấp, hôm nay bộ mặt của diễcnn đàn nhìn mà dễ thương thế. cảm ơn BQT 4R đã cho các Member được vui vẻ cùng diễn mão mới của 4R.
Sau đay tôi có 1 câu hỏi mong các thành viên giúp đỡ:
1/ Trên Fr Chcong có nút Print, mục đích củ nút là kết xuất ra report nhờ câu lệnh SQL, Sau khi tôi thử trên 1 sheet thì không sao nhưng khi liên kết trên 2 sheet thì bi lỗi.
Các bạn chay thử CT và xem báo lỗi, và cho tôi sự giúp đỡ.
(Nhấn nút chấm công -> chọn nhân viên (enter) và tháng (nhập tháng 1-vì DL tôi mới nhập cho tháng 1 và nhấn Enter) sau đó nhấn nút Yes -> form chamcong -> nhấn nút Print -> báo lỗi)
Tôi gửi kèm file cho các bạn xem và giúp đỡ (Chỉ ra nguyên nhân lỗi và cách khắc phục)
2/Với câu lênh đó tôi muốn thêm mệnh đề:
– Order by ascending/de-ascending.
– Group by
…
Cho hỏi: a và b, là table định nghĩa trong sheet hay trong code? code nào?
Xin thông cảm, tôi tìm mờ mắt mà không thấy.
A va b la ky tu dai dien cho sheet khai bao trong mệnh đề From shName ->a, Dstv -> b
Nếu câu lệnh tôi viết là:Call Table_Query("qrBaocao", ThisWorkbook.Sheets("BAOCAO"), "A5", "ODBC", ThisWorkbook.Path & _
"" & ThisWorkbook.Name, "Select a.Ngay, a.Tugio, a.dengio, a.noidung From `" & shName & "$` a Where right(a.Ngay,2) = '01'")thì không báo lỗi và chạy đúng nhưng thêm vao2 1 bảng nữa thì nó báo lỗi (tham chiếu từ 2 bảng)
Bạn thử chạy bằng dòng code tôi đã đánh dấu bên trên thì biết kết quả
Cả câu lệnh trên (đã đánh dấu, nay bỏ đánh dấu để chạy) cũng bị báo lỗi theo cái Msgbox trong module1. Nếu đánh dấu cái Msgbox để không hiện thông báo thì không hiện kết quả gì cả.
Tuy nhiên theo tôi hiểu thì:
– nếu 2 điều kiện lọc thì phải là And : (thí dụ trong file trên bạn dùng dấu phẩy):
Where a.Hoten = b.MaNv [COLOR=red][B]and[/B][/COLOR] right(a.Ngay,2) = '01'
– Nếu muốn Group by thì thêm vào sau câu Where, nhưng phải có ít nhất 1 trường sum, hoặc count, hoặc min, max:
GROUP BY b.HoTen, a.xyz
– nếu muốn sort thì thêm vào sau câu GROUP BY:
ORDER BY b.Ngay (nếu sort Ascending)
ORDER BY b.Ngay DESC (nếu sort Descending, không phải de-ascending nhé)
Đúng là tôi đã quên toán tử and. Ngớ ngẩn quá.
Tôi viết de-ácenndiinngg là do tôi quên tham sô Desc nên viết vậy.
Câu lệnh đã chạy ngon sau khi thêm and vào giữa 2 điều kiện.
SQL tuyệt vời vì với nó tgian xử lý trích lọc/sắp xếp dữ liệu cực nhanh.
Bạn PTM cho hỏi và giúp đỡ thêm/ SQL trên Excel thật khó hiểuLỗi này là như thế nào?
Order By phải nằm sau Group By. Bạn xem lại bài 4 mình cũng ghi như vậy.
Ngoài ra Group By phải liệt kê tất cả các trường không sum, count, Min, max,..
Tại sao phải liệt kê đầy đủu field sau group by
Tại sao phải liệt kê đầy đủ các trường nhỉ? Nếu tôi chỉ group by theo 1 số lượng ký tự (nhóm) trong 1 trường thì làm sao bạn?
Ví dụ trường Ngay của tôi có cấu trúc như sau: Ngay01Ca01/Ngay01Ca02/Ngay01Ca03…
Ngay02Ca01/Ngay02Ca02/Ngay02Ca03….
….
Thì tôi phải viết như thế nào trong mệnh đề Group by ?
Bạn giúp đỡ nhé
1. Trường đây là trường của Query, không phải trường của table gốc. Số lượng trướng của Query có thể ít hơn, bằng, hoặc nhiều hơn số lượng trường của table.
Vậy Query có bao nhiêu trường, trừ đi số trường sum, count, …, còn bao nhiêu liệt kê hết trong group by.
2. Nếu trường của Query là right(a.ngay,2) thì group by right(a.ngay,2)
Về Group by và Order By bạn có thể tham khảo SQL trong Access hoặc môi trường khác mà bạn biết. Excel chỉ khác chỗ khi gọi table có thêm tên file, tên sheet, trước tên (name) của table. Với lại khi làm trong Excel bạn có thể xem cấu trúc câu SQL bằng cách thử trong data – import external data – new database query
——–
À, tôi đã hiểu, bây giờ tôi có muốn nối bảng chi tiết vói bảng đã sum theo nhóm(nối hai query table) thì tôi viết thế nào cho đúng? Ví dụ tôi viết:(…. "Select left(a.Ngay,6) as ' Ngay LV ', sum(a.Tugio) as ' Tu gio ', sum(a.dengio) as ' Den gio ', b.TenNv From `" & shName & "$` a, `" & shDs & "$` b Where a.Hoten = b.MaNv group by left(a.ngay,6),b.tennv" inner joint "Select left(a.Ngay,6) as ' Ngay LV ', sum(a.Tugio) as ' Tu gio ', sum(a.dengio) as ' Den gio ', b.TenNv From `" & shName & "$` a, `" & shDs & "$` b Where a.Hoten = b.MaNv group by left(a.ngay,6),b.tennv")
có đúng không bạn???
Trong MS Access và Excel, dù mặc định tất cả field là group by, nhưng khi có ít nhất 1 trường tính sum, max, … vẫn phải liệt kê những trường còn lại là group by. Thuật ngữ group by không đồng nghĩa chính xác với group mà ta hiểu theo nghĩa thông thường.
Thí dụ ta muốn tính tổng truờng stien, group theo Soctu, nếu kèm theo Soctu ta muốn thể hiện nội dung của chứng từ, thì add thêm trường noidung. Trường nội dung đó vẫn phải khai báo group by. Vậy câu sau đúng:
Group by left(ngay,3),Ngay,fld1,fld3,fld4
Hạn chế của nó là giả sử chứng từ có 3 mục, trong đó 2 mục nội dung giống nhau, mục thứ 3 khác 1 dấu phẩy chẳng hạn, Query sẽ tách ra 2 dòng, mỗi dòng cho 1 nội dung.
Thêm trường thứ 3, thứ tư cũng vậy.
Bạn thử access xem, dễ hơn Excel.
Phần Bạn xem câu lệnh SQL tôi viết ở trên để joint 2 table-query có đúng không nhé.
Đây là câu lệnh tạo 1 bảng tổng hợp có dòng cộng nhóm và các chi tiết trong nhóm/và có thể là tổng tất cả nếu Joint với 1 table-query tổng (chẳng hạn).
www.giaiphapexcel.com/diendan/threads/l%E1%BB%97i-c%C3%A2u-l%E1%BB%87nh-sql-kh%C3%B4ng-hi%E1%BB%83u-mong-c%C3%A1c-b%E1%BA%A1n-gi%C3%BAp-%C4%91%E1%BB%A1.14211/
Khóa học Power PI – Ứng dung trong Nhân sự
TỔNG QUAN KHÓA HỌC: POWER BI CHO NGÀNH NHÂN SỰ Khóa học Power BI cho Nhân sự được thiết kế dành riêng cho các...
Xem khóa học
Gởi bạn Sealand,
Xin thưa với bạn rằng Những bài tôi viết trên đều đã thực hành trên máy trước khi post lên:
Nếu có 5 field, trong đó 1 field có tính toán sum, count, max, … Mà chỉ khai báo group by 1 trường, cả Excel và Access đều báo lỗi:
You tried to execute a query that does not included the specified expression <field name> as part of an agreegate function.
Chỉ khi khai báo Group by đủ 4 trường còn lại mới hết lỗi.
Thứ 2: Ban Manh Hung đang hỏi trong Excel, thì phải tuân thủ cấu trúc SQL của Excel, tôi đã đề nghị bạn ấy thực hành query bằng wizard để xem cấu trúc SQL. Nếu bạn cũng thực hành trên Excel và Access thì cũng sẽ thấy .
Thứ 3: tôi cũng có nói nếu 1 field nào đó không đồng nhất dù chỉ 1 dấu phẩy, kết quả cũng sẽ không như ý muốn. Nay tôi nhấn mạnh đó là lỗi nhập liệu, không phải lỗi Query. Trường nào không đáp ứng tính đồng nhất (thí dụ trường đơn giá trong bảng kê nhập hàng) thì không đưa vào. Đưa vào là Excel và cả Access đều tự động khai báo group by, sai ráng chịu.
To Manh Hung: Kể cả trường số không đồng nhất luôn.
Thí dụ như bạn tính tổng tiền của 1 phiếu nhập kho nhiều mặt hàng, group theo số phiếu nhập, thì trường đơn giá, trường số lượng là trường số không đồng nhất.
Bạn có thể cho 1 file thí dụ đã kết xuất 2 Query lên sheet rồi không? Kèm theo là 1 bảng kết quả mong muốn.
Sorry vì mấy file chạy code của bạn tôi chưa bao giờ chạy code được. Máy tôi nó thiếu cái gì đó. Mấy bữa nay toàn thử bằng file khác hoặc thử bằng MS Query wizard. Thực sự tôi chưa hề thử trường hợp lấy query này làm nguồn cho query khác trên Excel. Access thì khác, thoải mái lắm.
Bạn không kèm theo bảng kết quả mong muốn, nên khó làm theo đúng ý bạn được. Tuy nhiên phương pháp như sau:
– Đặt name cho vùng chứa Query 1 và Query 2, hoặc đặt tên cho bản thân query bằng code trong VBA sau khi tạo.
– Tạo query mới từ 2 name mới đặt.
Dù vậy, 2 query có sẵn trong file của bạn khi tạo query mới chả có ý nghĩa gì, bỏi bản thân của chúng: 1 cái là tổng hợp, 1 cái là chi tiết của cùng 1 nội dung.
Bạn xem file sẽ thấy.
Ngoài ra tôi cũng tạo 1 file khác, với dữ liệu mẫu. Trong sheet CDPS tôi tạo lần lượt 3 query riêng biệt (bạn xem trong name):
– cái thứ nhất từ A đến D: số dư đầu kỳ
– cái thứ 2 từ E đến F: phát sinh nợ trong kỳ (dùng sum và group by)
– cái thứ 3 từ G đến H: phát sinh có trong kỳ (dùng sum và group by)
Rồi tôi tạo query thứ tư từ J đến O, tổng hợp 3 cái kia lại, với outer joint. nghĩa là lấy nguồn là 3 cái kia theo name. Name này là Excel tự đặt nên dài, bạn có thể đặt tên lại. Tuy nhiên vì bạn dùng code, nếu mỗi query là 1 sheet, bạn lấy ngay tên sheet thêm dấu $ làm tên query. Hay là bạn thử "tensheet!$A:$E" làm table nguồn xem nó chịu không.
Muốn xem cấu trúc SQL của cái nào thì để ô chọn trong vùng đó, nhấn nút Edit Query trong thanh công cụ External Data.
Code không chay được, nhưng tôi disable macro để xem và đã thấy 2 query đó, và đã tạo query mới ở dưới. Nhưng query mới đó theo như bài 21 là sai rồi.
File của tôi cũng tạo query cùng loại nên cũng chưa đúng ý.
Union tôi chưa nghiên cứu tới.
Trong Access tôi phải đưa vào report, group trong report, với group header và group footer, mới ra cấu trúc đó.
Để tôi với bạn có thể cùng nghiên cứu, bạn hãy cho tôi: (không cần file)
– câu lệnh SQL query thứ nhất
– câu lệnh SQL query thứ hai
– Câu lệnh SQL có cấu trúc Union dựa trên 2 query trên.
Dùng dữ liệu cũ để cho kết quả như bài trên.
Tất cả bằng cấu trúc của môi trường không phải Excel, của Access càng tốt, tôi sẽ thử chuyển sang Excel.
GROUP BY được dùng khi trong SELECT sử dụng các hàm thống kê như ;SUM, COUNT, AVR,…Khi đó, các cột cần được nhóm lại thì phải được đặt sau mênh đề GROUP BY. Nếu có điều kiện mà phải dùng tới những cột/field mà nằm trong GROUP BY thì phải dùng điều kiện sau mệnh đề HAVING .
Bạn sử dụng A-Tools hoặc một cộngcu SQL (Script) Builder sẽ học được nhiều về SQL vì nó tạo cho bạn câu lệnh SQL không chỉ cho Access mà cho các loại CSDL.
Nói rõ yêu cầu ra nhé. Lấy cột chư thế nào, dữ liệu gốc ở đâu?
Hướng làm như bài #21, bạn dùng 2 SQL sau đó UNION là được
SQL1 = "SELECT ngay, SUM(filed1), SUM(filed1) FROM nguon GROUP BY ngay"
SQL2 = "SELECT ngay, filed1, filed1 FROM nguon
SQLTH = SQL1 & " UNION ALL " & SQL1 & " ORDER BY ngay"
Bạn nên tìm và sử dụng các công cụ để hiểu biết nhiều hơn, năng suất cao hơn! Có rất nhiều các công cụ tạo cho bạn câu truy vấn SQL, có rồi bạn paste vào ứng dụng của bạn là xong thôi. Không biết vì sao với bạn tìm và sử dụng một công cụ lại khó đến thế? Thời gian bạn lặn lội với yêu cầu để làm thuần túy trên một công cụ của Excel thì bạn đã học được gấp 10 lần nếu với những công cụ khác!