PDA

View Full Version : Lấy ra dữ liệu ngày mới nhất của từng nhân viên



Sess_Kakashi
22-12-2011, 14:27
Mình có 3 table là nhanvien (ID_NV,Hoten...), ChucVu(ID_CV,TenCV), QDChucVu(ID_QD,NgayQD,ID_NV,ID_CV).

dữ liệu nhập vào QDChucVu như sau:



(1,5/10/2010,'NV01','TP')
(2,22/11/2011,'NV01','GD')
(3,5/11/2010,'NV02','GD')
(4,15/12/2011,'NV02','PGD)

mình muốn lấy ra những nhân viên có chức vụ là GD hay PGD, vậy thì khi chạy sẽ ra 2 giá trị 2 và 4. Mình viết câu lệnh SQL như sau:




create proc NguoiKy
as
select n.ID_NV,n.HoTen,c.TenCV,qd.NgayQD
from NhanVien n, ChucVu c,QDChucVu qd
where n.ID_NV=qd.ID_NV and c.ID_CV=qd.ID_CV and qd.ID_CV ='GD'
group by n.ID_NV,n.HoTen,c.TenCV,qd.NgayQD
order by qd.NgayQD desc
union
select n.ID_NV,n.HoTen,c.TenCV,qd.NgayQD
from NhanVien n, ChucVu c,QDChucVu qd
where n.ID_NV=qd.ID_NV and c.ID_CV=qd.ID_CV and qd.ID_CV ='PGD'
group by n.ID_NV,n.HoTen,c.TenCV,qd.NgayQD
order by qd.NgayQD desc

nhưng mà lúc xuất ra thì nó lại ra cả 2,3,4
Mình tìm hoài vẫn không biết thế nào. Ai biết thì chỉ dùm.
Thanks

SantaSatan
22-12-2011, 15:03
Cách làm của bạn phần 1 sẽ cho ra 2, 3 và phần 2 sẽ cho ra 4. Vì các dòng này khác nhau nên union chẳng lọc bỏ dòng nào
Thực ra vói cùng kết quả câu trên bạn chỉ cần thay
... and qd.ID_CV ='GD' -- với
... and qd.ID_CV in ('GD', 'PGD')
Là nó đủ rồi, không cần union với phần phái saqu

Tôi không chỉ code cho bạn được vì tôi chưa đủ 10 post. Diễn đàn khônng cho post code
Đại khái thì bạn phải dùng truy vấn nội (correlated query) để tỉm dòng ứng với dòng có này lớn nhất.

Sess_Kakashi
23-12-2011, 00:03
select n.ID_NV,n.HoTen,c.TenCV,qd.NgayQD
from NhanVien n, ChucVu c,QDChucVu qd
where n.ID_NV=qd.ID_NV and c.ID_CV=qd.ID_CV and qd.ID_CV in ('gd','pgd')
group by n.ID_NV,n.HoTen,c.TenCV,qd.NgayQD
order by qd.NgayQD desc

mình sửa lại như thế này nhưng mà giờ nó không xuất ra dữ liệu gì cả, chỉ hiện tên các cột mình select thôi

SantaSatan
23-12-2011, 07:21
Mặc định CSDL của bạn có phân biệt chữ hoa và chữ thường không?

SantaSatan
23-12-2011, 08:34
Thử như vầy xem. Đây là code dùng truy vấn nội.

select n.ID_NV, n.HoTen, c.TenCV, qd.NgayQD
from NhanVien n, ChucVu c, QDChucVu qd
where n.ID_NV=qd.ID_NV and c.ID_CV=qd.ID_CV and qd.ID_CV in ('GD', 'PGD')
AND qd.NgayQD IN
( select MAX(NgayQD) from QDChucVu where ID_NV = qd.ID_CV
and ID_CV in ('GD', 'PGD') )
order by n.ID_NV, n.HoTen, c.TenCV, qd.NgayQD desc