2012-06-20 6 views
5

Oto tabele:Wybierz licznik z innej tabeli dla każdego wiersza w wierszach wynikowych

CREATE TABLE [dbo].[Classes](
    [ClassId] [int] NOT NULL, 
    [ClassName] [nvarchar](50) NOT NULL, 
CONSTRAINT [PK_Classes] PRIMARY KEY CLUSTERED 
(
    [ClassId] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TABLE [dbo].[Students](
    [StudentId] [int] NOT NULL, 
    [ClassId] [int] NOT NULL, 
CONSTRAINT [PK_Students] PRIMARY KEY CLUSTERED 
(
    [StudentId] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 
ALTER TABLE [dbo].[Students] WITH CHECK ADD CONSTRAINT [FK_Students_Classes] FOREIGN KEY([ClassId]) 
REFERENCES [dbo].[Classes] ([ClassId]) 
GO 
ALTER TABLE [dbo].[Students] CHECK CONSTRAINT [FK_Students_Classes] 
GO 

Chcę uzyskać listę klasy, a każda klasa - liczba uczniów należących do każdej klasy. Jak mogę to zrobić?

Odpowiedz

17

Trzeba to zrobić -

SELECT C.ClassId, C.ClassName, count(S.StudentId) AS studentCount 
FROM CLASSES C LEFT JOIN STUDENTS S ON (C.ClassId=S.ClassId) 
GROUP BY C.ClassId, C.ClassName 
+0

Jak @Kshitij zaznaczył różnicę między swoim zapytaniu dowolny kopalnia będzie, że moje pytanie spowoduje pomijają żadnych klas, które nie mają uczniów - stąd upvote :) – Kane

2

Masz na myśli coś takiego?

SELECT C.[ClassName], COUNT(*) AS 'Number of Students' 
FROM [dbo].[Classes] AS C 
    INNER JOIN [dbo].[Students] AS S ON S.[ClassId] = C.[ClassId] 
GROUP BY C.[ClassName] 
0
SELECT class.ClassId, count(student .StudentId) AS studentCount 
FROM dbo.CLASSES class LEFT JOIN dbo.STUDENTS student ON (class.ClassId=student.ClassId) 
GROUP BY class.ClassId 
+0

[przepełnienie stosu] (//stackoverflow.com) akceptuje ** odpowiedź typu "tylko kod", ale nie jest to * bardzo * pomoc dla innych. Proszę [edytuj] odpowiedź i wyjaśnij * Jak działa twój kod *. Czasami też * Dlaczego kod OP nie działa *. –

0
select c.ClassId,C.ClassName,COUNT(*) [Number of students] 
from Classes C,Students S 
where c.ClassId=S.ClassId 
group by C.ClassId,C.ClassName 
Powiązane problemy