2010-04-23 39 views
8

Tôi HAVA sql như sau: đếm cột nhóm bởi

select a.dept, a.name 
    from students a 
group by dept, name 
order by dept, name 

Và có được kết quả:

dept name 
-----+--------- 
CS | Aarthi 
CS | Hansan 
EE | S.F 
EE | Nikke2 

tôi muốn tóm tắt các num của sinh viên đối với từng nợ như sau:

dept name  count 
-----+-----------+------ 
CS | Aarthi | 2 
CS | Hansan | 2 
EE | S.F  | 2 
EE | Nikke2 | 2 
Math | Joel  | 1 

Làm cách nào để viết sql?

+0

nhìn vào những người kết quả, chú ý đến 2 sau CS và EE depts – BlackICE

+0

@zhangzhong: những gì cơ sở dữ liệu? –

Trả lời

14

Mặc dù nó xuất hiện bạn không hiển thị tất cả các bảng, tôi chỉ có thể giả định có một bảng đăng ký thực tế khác cho mỗi sinh viên

select a.Dept, count(*) as TotalStudents 
    from students a 
    group by a.Dept 

Nếu bạn muốn tổng số eac h bộ phận liên kết với mỗi học sinh (mà không có ý nghĩa), bạn có thể sẽ phải làm điều đó như ...

select a.Dept, a.Name, b.TotalStudents 
    from students a, 
     (select Dept, count(*) TotalStudents 
      from students 
      group by Dept) b 
    where a.Dept = b.Dept 

Việc diễn giải cột "Tên" của bạn là tên của học sinh chứ không phải là của người hướng dẫn thực tế của lớp do đó tôi chọn/tham gia. Nếu không, giống như những người khác, chỉ cần sử dụng COUNT (*) làm cột thứ ba là tất cả những gì bạn cần.

6
select a.dept, a.name, 
     (SELECT count(*) 
      FROM students 
     WHERE dept = a.dept) 
    from students a 
group by dept, name 
order by dept, name 

Đây là truy vấn có vấn đề, vì bạn nhận được bản sao trùng lặp của bộ đếm. Sẽ sạch hơn khi tìm nạp danh sách sinh viên và bộ được tính là kết quả riêng biệt. Tất nhiên, có thể có những lý do thực dụng để đi theo cách khác, vì vậy đây không phải là một quy tắc tuyệt đối.

+1

sai, điều này cho 1 của sau khi depts – BlackICE

+0

Cảm ơn bạn đã chỉ ra rằng @David. –

+0

phiên bản đã chỉnh sửa là chính xác, và tôi nghĩ thực sự là SQL sạch hơn so với hai phiên bản khác là chính xác. – BlackICE

0

này nên làm điều đó (tôi đã không có bất kỳ môi trường để thử nghiệm trên ở phút)

select a.dept, a.name, count(a.*) as NumOfStudents 
from students a 
group by dept, name order by dept, name 

HTH

+0

điều này cũng cho 1 của sau khi các bộ phận – BlackICE

1
SELECT dept, name, COUNT(name) as CT from students 
group by dept, name 
order by dept, name 
+0

này cũng cho 1 của sau khi nợ – BlackICE

0

Hoặc Nếu không viết đơn giản

select dept, name, count(name) as nostud from students group by dept, name order by dept, name 
+0

này cũng cho 1 của sau khi các phòng – BlackICE

0

này sẽ cung cấp các kết quả yêu cầu nêu trên

select a.dept, a.name, cnt 
from student a 
join (
select dept, count(1) as cnt 
from student 
group by dept 
) b on b.dept = a.dept