Lỗi câu lệnh SQL? Không hiểu, mong các bạn giúp đỡ

Liên hệ QC

manhhung12

Thành viên thường trực
Tham gia
20/3/08
Bài viết
232
Được thích
88
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
...
 
Lần chỉnh sửa cuối:
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.
 
Upvote 0
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à:
HTML:
        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ả
 
Lần chỉnh sửa cuối:
Upvote 0
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):
Mã:
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é)
 
Upvote 0
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):
Mã:
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.
 
Upvote 0
Bạn PTM cho hỏi và giúp đỡ thêm/ SQL trên Excel thật khó hiểu

Lỗi này là như thế nào?
Bạn xem file gửi kèm
 
Lần chỉnh sửa cuối:
Upvote 0
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,..
 
Upvote 0
Tại sao phải liệt kê đầy đủu field sau group by

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 đủ 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é
 
Upvote 0
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
 
Upvote 0
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:
HTML:
(.... "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???
 
Lần chỉnh sửa cuối:
Upvote 0
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.
 
Upvote 0
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).
 
Upvote 0
Mình thấy ý kiến các bạn có điểm không chính xác:
Trong SQL nếu đã khai báo mệnh đề group by theo 1 field nào đó thì không thể khai báo 1 group by khác không chủ ý tránh những trường hợp không đồng nhất của các field không chủ ý sẽ tạo ra các nhóm không theo ý muốn.
Ngoài các field chủ ý Group by các field khác đều phải áp dụng công thức, các field ký tự dùng firt,last,count, field so dùng sum .Vậy làm sao khai tên field được trong SQL sử dụng Group by.
Để đơn giản cách viết bạn Import sheet vào Access rồi dùng trình thiết lập Query của Access lập Query sau đó chép lấy câu lệnh SQL để tham khảo.
 
Upvote 0
Mình thấy ý kiến các bạn có điểm không chính xác:
Trong SQL nếu đã khai báo mệnh đề group by theo 1 field nào đó thì không thể khai báo 1 group by khác không chủ ý tránh những trường hợp không đồng nhất của các field không chủ ý sẽ tạo ra các nhóm không theo ý muốn.
Ngoài các field chủ ý Group by các field khác đều phải áp dụng công thức, các field ký tự dùng firt,last,count, field so dùng sum .Vậy làm sao khai tên field được trong SQL sử dụng Group by.
Để đơn giản cách viết bạn Import sheet vào Access rồi dùng trình thiết lập Query của Access lập Query sau đó chép lấy câu lệnh SQL để tham khảo.
Bạn nói khó hiểu thế."chủ ý" nghĩa là sao vậy?? Đúng như PTM nói. Sau group by phải liệt kê tất cả các trường không sum/sount/min/max và đẻ có kết quả mong muốn thì không truy vấn trên các trường không phải là số mà giá trị của nó không đồng nhất (ví dụ trường tên)
 
Upvote 0
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.
 
Lần chỉnh sửa cuối:
Upvote 0
To PTM và Manhhung:
Các bạn đều không hiểu ý mình rồi. Mình không nói là các bạn không đúng về cú pháp mà nó có vấn đề kết quả. Ví dụ Table có 3field cần đưa vào kết quả là Soct, noidung, sotien
chi tiết như sau:

PC00234 Chi mua hàng 120.000
PC00234 Thuế VAT 12.000


Chủ ý của ta là cộng tiền theo tùng chứng từ, kết quả phải là:

PC00234 Chi mua hàng 132.000

Như vậy, đương nhiên là sum(sotien)group by Soct rồi. Nhưng nếu Group by noidung nữa thì kết quả lại cho 2 dòng chứ không phải 1 dòng như chủ ý
 
Upvote 0
Gởi bạn Sealand,

To Manh Hung: Kể cả trường số không đồng nhất luôn.
Trường số không đồng nhất là khác kiểu dữ liệu phải không bạn? Tôi chưa thử.
Bạn cho tôi hỏi thêm:
Tôi làm hai câu query riêng biệt cho kết xuất ra 2 table_query
1/Tổng hơp (qrTH)
2/Chi tiết(qrCT)
Sau đó thì không biết nối table_query này lai vói nhau và sort trên mã như thế nào? để được 1 table Báo cáo gồm các bản ghi cộng theo nhóm và các bản ghi chi tiết của từng nhóm.
Bạn giúp đỡ thêm
 
Upvote 0
Trường số không đồng nhất là khác kiểu dữ liệu phải không bạn? Tôi chưa thử.
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.
 
Upvote 0
Đây bạn. Tôi kết xuất trên 1 sheet: Baocao : Quyery 1 bắt đầu từ ô A5/ quyery 2 bắt đầu từ F5.
Thực ra nếu kết xuất trên 2 sheet khác nhau thì sau đó lai kết xuất thêm 1 lần nữa chắc là được nhưng tôi thấy cách này hơi kỳ kỳ.
 

File đính kèm

  • CPE142008.rar
    169.6 KB · Đọc: 74
Upvote 0
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.
 

File đính kèm

  • CPE142008.xls
    50 KB · Đọc: 33
  • Database2.xls
    41.5 KB · Đọc: 25
Upvote 0
Web KT
Back
Top Bottom