SQL à COUNT éléments associés à des individus

J'ai une table (ClassEnrolments) qui contient des données sur les étudiants:

StudentId Student Module Status EndDate Credits 12345678 J Bloggs Introduction Pass 2014/09/01 10 12345678 J Bloggs Advanced Pass 2014/06/01 15 23456789 T Guy Introduction Pass 2013/05/25 10 23456789 T Guy Advanced Pass 2014/03/21 15 

Ce que je veux faire, c'est renvoyer des informations sur le nombre total de modules que l'étudiant a pris au cours d'une période donnée, par exemple, si nous prenons datatables ci-dessus et regardons la période 01/01/2014 à 24/11 / 2014, il returnnera ce qui suit (basé sur EndDate)

 StudentId Student Modules Credits AnnivDate 12345678 J Bloggs 2 25 2015/06/01 23456789 T Guy 1 15 2014/05/25 

C'est en utilisant SQL Server 2008 – toute aide serait grandement appréciée.

Je me request maintenant si en utilisant le même scénario – il est possible de countr le nombre de crédits obtenus à partir de ces modules pris?

Une autre pensée! Il serait utile de voir une sorte de date anniversaire basée sur le module le plus important des étudiants pris. Cela aidera à établir si l'étudiant a obtenu le nombre correct de crédits avant la date anniversaire. J'ai joué avec l'idée de la fonction DATEADD, mais cela a semblé reproduire l'information de l'étudiant.

 DATEADD(MONTH, DATEDIFF(MONTH, 0, EndDate()) +12,0) AS AnnivDate 

Je comprends pourquoi, car il y aura plusieurs instances, mais est-il possible de regarder la première instance de EndDate?

Utilisez le paramètre Group By et le count fonctions d'agrégation pour countr le Module et filterr datatables en utilisant l' Between operator pour filterr datatables entre une plage de dates particulière

 SELECT StudentId, Student, Count(Module) Module, Sum(Credits) Credits FROM tablename WHERE EndDate BETWEEN '2014-01-01' AND '2014-11-24' GROUP BY StudentId, Student 

Essaye ça:

 Set dateformat DMY; Select StudentId, Student, Count(Modules) as ModuleCount from ClassEnrolments Where EndDate >= convert(Datetime, '01-01-2014', 105) and EndDate <= convert(Datetime, '24-11-2014', 105) Group By StudentId, Student 

Essaye ça:

 SELECT StudentId, Student, COUNT(*) Modules FROM ClassEnrolments WHERE EndDate BETWEEN '2014-01-01' AND '2014-11-24' GROUP BY StudentId, Student 
 SELECT StudentID, Student, Count(module) AS Modules FROM ClassEnrolments GROUP BY StudentID, Student 

Avec date

 SELECT StudentID, Student, Count(module) AS Modules FROM ClassEnrolments WHERE EndDate BETWEEN '2014-01-01' AND '2014-11-24' GROUP BY StudentID, Student 
 SELECT StudentId,Student,COUNT(*) FROM TableName WHERE EndDate BETWEEN '2014-01-01' AND '2014-11-24' AND Status = 'Pass' GROUP BY StudentId,Student 

Pas vraiment ce que vous avez demandé, mais potentiellement une autre option en fonction de ce que vous voulez returnner.

 DECLARE @ClassEnrollments TABLE ( StudentId INT ,Student VARCHAR(50) ,Module VARCHAR(50) ,Status VARCHAR(50) ,EndDate DATE ) INSERT INTO @ClassEnrollments VALUES (12345678,'J Bloggs','Introduction','Pass','2014/09/01') ,(12345678,'J Bloggs','Advanced','Pass','2014/06/01') ,(23456789,'T Guy','Introduction','Pass','2013/05/25') -- Excluded ,(23456789,'T Guy','Advanced','Pass','2014/03/21') SELECT StudentId ,Student ,Module ,Status ,EndDate ,COUNT(Module) OVER (PARTITION BY studentId) as #Modules FROM @ClassEnrollments WHERE EndDate BETWEEN '2014-01-01' AND '2014-11-24' ORDER BY StudentId ,Module