2010-08-06 5 views
1

Voici ce que je travaille avec (SQL Server):SQL Server rejoint, groupes, etc. et faire simple numéro crissement

  • départements: deptID, DEPTNAME
  • étudiants: studID , studName, deptID
  • affectation: studID, courseID, état

Les étudiants sont affectés à un département et le dossier de l'étudiant contient le numéro d'identification du département. La «cession» est un lien entre un étudiant et un cours (cours non montré) qui détient un statut (incomplet, réussi, non tenté).

Je veux la liste des départements et, chaque département, le nombre total d'étudiants dans ce département et le nombre total de missions avec chaque statut individuel (voir exemple ci-dessous si cette formulation est source de confusion.)

Idéalement J'aurais une rangée retournée par département. Lorsque vous exécutez des requêtes comme celle-ci, c'est généralement un problème que je rencontre.

Exemple: Un département a 5 étudiants et 5 cours. Chaque étudiant se voit attribuer chacun de ces 5 cours. Un seul étudiant a terminé tous les cours, les autres n'ont rien fait. Par conséquent, les totaux pour ce ministère seraient 20 non-essayés, 5 réussis, 0 incomplets. Je serai heureux avec une réponse qui suggère le SQL à un niveau très abstrait ... J'ai juste besoin de savoir si les jointures doivent être imbriquées ou si cela fonctionne.

Répondre

2

Quelque chose comme

SELECT departments.deptName, 
     sum(case when status = 'attempted' then 1 else 0 end) as attempted_count, 
     sum(case when status = 'passed' then 1 else 0 end) as passed_count, 
     sum(case when status = 'incomplete' then 1 else 0 end) as complete_count 

FROM departments JOIN students JOIN Assignment 
GROUP BY departments.deptName 

Comme vous le vouliez juste l'idée, je ne mentionnaient pas l'REJOIGNEZ conditions.

+0

Travaillé comme un charme (en théorie ... n'a pas vérifié les résultats.) N'a jamais utilisé un conditionnel comme ça avant. – Guttsy

0

Cela vous donnera envie dont vous avez besoin, à l'exception du nombre d'étudiants par département.

SELECT d.deptname, a.status, COUNT(a.status) 
FROM departments d 
JOIN students s ON d.deptid = s.deptid 
JOIN assignment a ON s.studid = a.studid 
GROUP BY d.deptname, a.status 

Pour ajouter le nombre d'étudiants par département, je ferais probablement juste une autre requête. Il serait difficile de le faire dans la même requête que vous groupez en fonction du statut d'affectation.

+0

Cela renvoie une ligne par département et par statut, et pas seulement une par département. – Frank

+0

Correct, mais comme le statut est inclus dans la sélection, il sera trivial d'utiliser cela à des fins d'affichage. – sgriffinusa

0

Qu'en est-il de quelque chose comme ça?

SELECT 
    D.deptName, A.status, 
    COUNT(*) AS statusCount, 
    COUNT(DISTINCT(S.studID)) AS studCount 
    FROM departments AS D 
    INNER JOIN students AS S ON D.deptID = S.deptID 
    INNER JOIN assignments AS A ON S.studID = A.studID 
    GROUP BY D.deptName, A.status 
+0

Cela permettra à l'étudiant de compter par département et statut d'affectation, il a demandé que ce soit par département seulement. – sgriffinusa

+0

Cela renvoie une ligne par département et statut, et pas seulement une par département. – Frank