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