PDA

View Full Version : Help SQL Server 2005: Hàm COUNT(*) đi kèm HAVING



ddt1899
12-02-2011, 18:45
Câu hỏi: Cho biết MaCN có đông nhân viên là nữ (F) nhất (hoặc ít nhân viên nữ nhất)
--> Em viết được truy vấn sau:
SELECT NHANVIEN.MaCN, COUNT(Phai) AS SONV
FROM NHANVIEN
WHERE Phai = N'F'
GROUP BY MaCN
HAVING COUNT(Phai) = ( SELECT TOP 1 COUNT(Phai)
FROM NHANVIEN
GROUP BY MaCN
ORDER BY COUNT(Phai) ASC)
-------------------------------------------------
- Khi tìm MaCN ít nhân viên nữ nhất (ORDER BY COUNT(Phai) ASC) --> cho KQ đúng
- ............ đông nhân viên nữ nhất (ORDER BY COUNT(Phai) DESC) --> câu truy vấn thì đúng nhưng KQ lại không có dòng nào được trả về. Tuy nhiên khi em tăng NV là nữ giả sử ở chi nhánh B3 lên thành 3 thì KQ lại trả về đúng!!!
Em đã thử cả mấy trường hợp: Tìm phòng ban có đông nhân viên nhất, lớp học có đông sinh viên nhất.... đều có kết quả là: nếu có 3 mẩu tin trở lên thì sẽ trả về, còn từ 2 mẩu tin trở xuống thì không có dòng nào trả về
Mong các anh nhiều kinh nghiệm giúp đỡ. (Em đính kèm file CSDL mẫu ở dưới) :(
http://i471.photobucket.com/albums/rr73/culekute1899/NHANVIEN1.jpg

Red Devilic
13-02-2011, 18:19
Câu hỏi: Cho biết MaCN có đông nhân viên là nữ (F) nhất (hoặc ít nhân viên nữ nhất)
--> Em viết được truy vấn sau:
SELECT NHANVIEN.MaCN, COUNT(Phai) AS SONV
FROM NHANVIEN
WHERE Phai = N'F'
GROUP BY MaCN
HAVING COUNT(Phai) = ( SELECT TOP 1 COUNT(Phai)
FROM NHANVIEN
GROUP BY MaCN
ORDER BY COUNT(Phai) ASC)
-------------------------------------------------
- Khi tìm MaCN ít nhân viên nữ nhất (ORDER BY COUNT(Phai) ASC) --> cho KQ đúng
- ............ đông nhân viên nữ nhất (ORDER BY COUNT(Phai) DESC) --> câu truy vấn thì đúng nhưng KQ lại không có dòng nào được trả về. Tuy nhiên khi em tăng NV là nữ giả sử ở chi nhánh B3 lên thành 3 thì KQ lại trả về đúng!!!
Em đã thử cả mấy trường hợp: Tìm phòng ban có đông nhân viên nhất, lớp học có đông sinh viên nhất.... đều có kết quả là: nếu có 3 mẩu tin trở lên thì sẽ trả về, còn từ 2 mẩu tin trở xuống thì không có dòng nào trả về
Mong các anh nhiều kinh nghiệm giúp đỡ. (Em đính kèm file CSDL mẫu ở dưới) :(
http://i471.photobucket.com/albums/rr73/culekute1899/NHANVIEN1.jpg

Bạn sai ở chỗ:

- Truy vấn bên trong hoàn toàn không có mệnh đề WHERE để lấy ra nhân viên nữ
- Muốn dùng sub-query như yêu cầu thì bản thân điều kiện ở truy vấn bên ngoài và bên trong phải giống nhau
- Truy vấn bên ngoài có mệnh đề WHERE Phai = N'F' nhưng trong chỉ group by MaCN rồi lấy TOP luôn, vì thế có thể lấy ra kq lớn nhất lại tương ứng với Phái = 'M' nên không trả ra kêt quả

tuan-nda
16-02-2011, 11:14
Ngắn gọn nhé. Để xem kqu Nữ nhiều nhất trong các Phòng ban.
1/Select MCN(Phòng ban) và Count MANV
2/Điều kiện là Nữ
3/Group MCN
4/Sắp xếp từ lớn đến nhỏ theo Count(Manv)
5/Lấy mẫu tin đầu tiên.
Xong!

Red Devilic
16-02-2011, 15:21
Ngắn gọn nhé. Để xem kqu Nữ nhiều nhất trong các Phòng ban.
1/Select MCN(Phòng ban) và Count MANV
2/Điều kiện là Nữ
3/Group MCN
4/Sắp xếp từ lớn đến nhỏ theo Count(Manv)
5/Lấy mẫu tin đầu tiên.
Xong!

Bạn nói quá chuẩn :D

Khi truy vấn dài và phức tạp ( mặc dù truy vấn của chủ topic cũng đơn giản ).
Cách tốt nhất là thực hiện rõ từng bước như trên, có thể test luôn từng bước để kiểm soát.

Tránh tình trạng viết 1 lúc quá dài, debug sẽ khó.

letoan12345
16-02-2011, 16:17
cac pan pro co biet ve c# k? chi minh voi

[=========> Bổ sung bài viết <=========]

trang dien dan k co thu tu gi ca

ddt1899
17-02-2011, 01:14
Thanks các bạn(anh) nhiều kinh nghiệm chỉ giáo, em đã vỡ ra được thêm vài thứ :D