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:
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.
Ồ Tôi đã xuất kết quả trong sheet baocao rồi mà:
query 1: bắt đầu từ ô a5 và query 2 bắt dầu từ ô f5. Bây giờ tôi muốn nối 2 query này lại thành 1vớii kết quả là có dòng tổng nhóm Ngay1 và chi tiết của ngay1, tiếp theo là tổng nhóm ngay2 với chi tiết của ngày 2:
Ngay01............8......32......Nguyễn hồng Hải
Ngay01Ca01......4......16......Nguyễn hồng Hải
Ngay01Ca02......4......16......Nguyễn hồng Hải
Ngay02..........12........8......Nguyễnhồng Hải
Ngay02Ca01......8........4......Nguyễnhồng Hải
Ngay02Ca02......4........4......Nguyễn hồng Hải
.....
Vậy đó bạn à. Tôi đã dùng thử phép toán nối union giữa 1 câu lệnh select nhưng không được vì trong excel thì SQL hơi khó chịu và tôi không hiểu.
Bạn chay file tôi gửi trên máy bạn không được sao?
 
Lần chỉnh sửa cuối:
Upvote 0
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.
 
Upvote 0
Đây bạn:
1/ Câu lệnh tạo query tổng nhóm theo 6 ký tự đầu của trường ngày
select left(a.Ngay,6) & "0000" as Ngay_lv, sum(a.tugio) as Tu_gio ,sum(a.dengio) as Den_gio, b.Tennv from NHH0101 a, DSTV b where a.HoTen=b.Manv group by left(a.Ngay,6),b.Tennv order by a.Ngay
Lưu ý: Phần tô đỏ là khi viết SQL trên VB phải thêm 4 số 0 ở sau 6 ký tự đầu của trường ngày và cuối cùng có 10 ký tự có dạng Ngay010000,Ngay020000,.... đẻ thuận tiện cho sắp xếp
2/ Câu 2 là liệt kê chi tiết:
select a.Ngay as Ngay_lv, a.tugio as Tu_gio,a.dengio as Den_gio, b.Tennv from NHH0101 a order by a.Ngay
3/ Union
select left(a.Ngay,6) & "0000" as Ngay_lv, sum(a.tugio) as Tu_gio ,sum(a.dengio) as Den_gio, b.Tennv from NHH0101 a, DSTV b where a.HoTen=b.Manv group by left(a.Ngay,6),b.Tennv order by a.Ngay
union
select a.Ngay as Ngay_lv, a.tugio as Tu_gio,a.dengio as Den_gio, b.Tennv from NHH0101 a order by a.Ngay
Tôi vẫn phân vân về mệnh đề group by. Nếu bạn tìm trên mạng về SQL và xem ví dụ nó không bắt liệt kê tất cả các trường sau mệnh đề này. Nó hiểu sau group by là 1 biểu thức điều kiện cho các hàm sum/count...
Chẳng hạn câu lệnh select lồng nhau thì câu lệnh select trong mệnh đề where là 1 biểu thức điều kiện.
Nói vậy thôi, bạn rành về SQL hơn tôi nên có gì không phải đừng giận nhé.
Thân.

Mỹ đâu rồi? Sao từ lâu kg hồi âm? Dẫ giai quyết xong vấn đề chúng ta bàn chưa
 
Upvote 0
Tôi vẫn phân vân về mệnh đề group by. Nếu bạn tìm trên mạng về SQL và xem ví dụ nó không bắt liệt kê tất cả các trường sau mệnh đề này. Nó hiểu sau group by là 1 biểu thức điều kiện cho các hàm sum/count...
Chẳng hạn câu lệnh select lồng nhau thì câu lệnh select trong mệnh đề where là 1 biểu thức điều kiện.

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.
 
Upvote 0
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.
Tôi muốn bạn quan tâm và giúp tôi về câu lệnh dùng để gộp kquả 2 truy vấn vào 1 bảng kết quả. Như tôi viết ở bài 21. Tôi cũng đang nghiên cứu thêm ở các công cụ bạn nói nhưng quả thực là nhiều quá nên xem chưa hết được
 
Upvote 0
Tôi muốn bạn quan tâm và giúp tôi về câu lệnh dùng để gộp kquả 2 truy vấn vào 1 bảng kết quả. Như tôi viết ở bài 21.

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"

Tôi cũng đang nghiên cứu thêm ở các công cụ bạn nói nhưng quả thực là nhiều quá nên xem chưa hết được
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!
 
Upvote 0
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!
Bài 23 là các câu SQL tôi muốn nối kết quả. Vì tôi đang làm SQL trong excel nên muốn các bạn giúp đỡ. Cũng biết rằng việc nghiên cứu và sử dụng công cụ đẻ nghiên cứu các vấn đề mình làm thì cũng là 1 kênh để học tập, còn trao đổi trên diễn đàn cũng là 1 kênh. Tuy nhiên do mục đích tham gia diễn đàn để học hỏi nhau, để trao đổi với nhau và các bài viết trên này là mọi người đều đọc được vậy nên tôi mới theo dõi topic này lâu như vậy(cho đến nay đã có khoảng 30 bài). Bạn thông cảm và hiểu cho.
 
Upvote 0
Web KT
Back
Top Bottom