Xin trợ giúp Câu lệnh SQL xuất dữ liệu
Xin chào các bạn, nhờ các bạn hướng dẫn giúp việc này: giả sử tôi một bảng có tên là H_Diemdo như sau:
Ma_KH Ten_KH Ma_tram Ngay_hieu_luc
1 Nguyen Văn A 140600110 11/4/2005
1 Nguyen Văn A 140600111 11/7/2009
2 Nguyen Van B 140600112 12/3/2005
2 Nguyen Van B 140600112 12/6/2009
Nay tôi muốn trích dữ liệu bằng câu lệnh SQL ra một bảng T_ketqua có đủ các thông tin trên, với điều kiện ngày hiệu lực là gần nhất:
Ma_KH Ten_KH Ma_tram Ngay_hieu_luc
1 Nguyen Văn A 140600111 11/7/2009
2 Nguyen Van B 140600112 12/6/2009
Mong các bạn giúp đỡ, rất cảm ơn và xin chúc các bạn luôn khỏe!
Select Ma_KH, Ten_KH, Max(Ngay_hieu_luc) As MaxHieuluc
From H_Diemdo
Group By Ma_KH, Ten_KH;
Nếu trong Access thì có thể dùng như sau:
[COLOR=#000000][COLOR=#0000BB]Select TOP 1 *[/COLOR][COLOR=#007700][/COLOR][COLOR=#0000BB] From H_Diemdo Order By [/COLOR][/COLOR][COLOR=#000000][COLOR=#007700][/COLOR][COLOR=#0000BB]Ngay_hieu_luc[/COLOR][COLOR=#007700][/COLOR][COLOR=#0000BB] DESC [/COLOR][/COLOR]Nếu là trong SQL thì có thể dùng như sau
[COLOR=#000000][COLOR=#0000BB]Select TOP 1 with ties *[/COLOR][COLOR=#007700][/COLOR][COLOR=#0000BB] From H_Diemdo Order By [/COLOR][/COLOR][COLOR=#000000][COLOR=#007700][/COLOR][COLOR=#0000BB]Ngay_hieu_luc[/COLOR][COLOR=#007700][/COLOR][COLOR=#0000BB] DESC [/COLOR][/COLOR]
Cách của RollOver chỉ lấy được duy nhất 1 record với ngày hiệu lực gần nhất. Yêu cầu là lấy mỗi mã KH 1 record.
Dữ liệu mẫu có Mã trạm khác nhau cho mỗi Mã KH nên lấy Max cũng chưa phải là đúng. Trừ khi loại trường Ma_Tram ra khỏi Query
Không phải là lấy duy nhất 1 record mà lấy toàn bộ các record có Ngày hiệu lực gần nhất đấy chứ. Còn lấy theo từng Mã trạm thì do tôi không thấy tác giả nói đến, nếu cần lấy theo từng Mã trạm thì dùng câu này
Với AccessSELECT * FROM H_DIEMDO T1 WHERE Ngay_Hieu_Luc & Ma_Tram IN( SELECT TOP 1 Ngay_Hieu_Luc & Ma_Tram FROM H_DIEMDO T2 WHERE T2.Ma_Tram=T1.Ma_Tram ORDER BY Ngay_Hieu_Luc DESC )Với SQL thì thay Ngay_Hieu_Luc & Ma_Tram thành Convert(char(8),Ngay_Hieu_Luc,112)+Ma_Tram
Phiền RollOver làm dùm 1 file access mẫu. Tôi thử cả 2 cách đều chỉ ra được 1 record duy nhất, tôi nghĩ là do câu "Top 1".
Nếu bỏ ma_Tram ra thì câu dưới đây lấy được 2 record cho 2 mã KH:
Select Ma_KH, Ten_KH, Max(Ngay_hieu_luc) As MaxHieuluc
From H_Diemdo
Group By Ma_KH, Ten_KH;
Nếu có cả Ma_Tram thì lấy ra 3 record, vì mã KH 2 có 2 record với mã trạm giống nhau. Trong khi Mã KH 1 có 2 record thì có 2 mã trạm.
Đây là file tôi đã làm dữ liệu giống với tác giả, có thêm 1 record nữa cho tổng quát
– Query1 lấy ra dữ liệu có Ngày hiệu lực lớn nhất
– Query2 lấy ra dữ liệu có Ngày hiệu lực lớn nhất theo mỗi Mã khách hàng
– Query3 lấy ra dữ liệu có Ngày hiệu lực lớn nhất theo mỗi Mã trạm
Với dữ liệu kết quả như bài #1 của tác giả thì hình như lấy theo mỗi Mã khác hàng chứ không phải Mã trạm
– Cái hay chính là TOP 1 đấy, nếu ptm test mà chỉ ra 1 record duy nhất thì cần xem lại xem test trên Access hay SQL, trên SQL thì phải thêm WITH TIES như bài số #4 tôi đã làm cho cả 2 trường hợp.
Qyery2 đúng ý tác giả hơn. Thanks Rollover.
Riêng Query 1 cũng y như tôi đã test, nếu 1 record RollOver thêm vào không trùng ngày với ngày lớn nhất thì chỉ lên có duy nhất 1 record như tôi đã test.
Còn kết quả như Query2 tôi cũng nghĩ tới, đó là dùng 1 query trung gian, nhưng chưa làm. Cách làm gộp thế này tôi chưa quen lắm.
Query1 là do tôi thấy tác giả nói là của Ngày hiệu lực gần nhất mà không thấy đề cập gì thêm. Nhưng cái TOP n của access nếu có nhiều giá trị trùng nhau thì nó sẽ lấy ra hết, cái này khác với trong SQL, trong SQL thì nó chỉ lấy chính xác n record đầu tiên, nếu muốn lấy như access thì thêm WITH TIES. TOP n trong nhiều trường hợp dùng để khử các hàm thống kê và sub query vì hàm thống kê và sub query thường có tốc độ xử lý rất chậm.
www.giaiphapexcel.com/diendan/threads/xin-tr%E1%BB%A3-gi%C3%BAp-c%C3%A2u-l%E1%BB%87nh-sql-xu%E1%BA%A5t-d%E1%BB%AF-li%E1%BB%87u.28200/
Kỹ năng giải quyết vấn đề hiệu quả
Mô tả Nội dung Đánh giá Tài nguyên KỸ NĂNG GIẢI QUYẾT VẤN ĐỀ HIỆU QUẢHiểu đúng vấn đề là một nửa của giải...
Xem khóa học
Bạn thử câu SQL sau:
Lê Văn Duyệt