2010-10-25 5 views
0

Compte tenu des lignes bien sûr suivantes, section, grade, le nombre de grades dans la section de cours:Retourne les enregistrements dont le nombre correspond max (nombre) pour une catégorie

course SECTION grade gradeCount 
----------------------------------- 
1301 001  C  3 
1301 001  C+  3 
1301 001  C-  4 
1301 001  D  5 
1301 001  D+  3 
1301 001  D-  2 
1301 001  F  18 
1301 002  A-  1 
1301 002  B  1 
1301 002  B-  3 
1301 002  C  2 

Je veux obtenir une liste des cours/sections avec le plus grand nombre de chaque note.

Par exemple:

Grade|Course|Section|Count 
A | 1301| 023 | 75  // 1301-023 had the most A's, 75 of them 
B | 1301| 033 | 65  // 1301-033 had the most B's, 65 of them 

liens doivent apparaître dans la liste.

+0

Cela ressemble à des devoirs ... –

+0

Votre entrée ne correspond en aucun cas à votre sortie. –

+0

Traitez-vous toutes les notes comme identiques, comme A- et A + sont tous A. –

Répondre

1

En supposant que le gradeCount est déjà le total de la notes pour chaque cours, section et grade uniques.

d'abord trouver le plus haut nombre pour chaque grade

SELECT 
    grade, 
    Max(gradeCount) as MaxGradeCount 
FROM 
    table 

Ensuite, trouver les lignes dans la table d'origine ont la note maximale

SELECT 
    course, 
    section, 
    grade, 
    gradeCount 
FROM 
    table 

     INNER JOIN 
    (SELECT 
     grade, 
     Max(gradeCount) as MaxGradeCount 
    FROM 
     table 
    ) MaxGrades 
     ON table.grade = MaxGrades.grade 
      AND table.gradeCount = MaxGrades.MaxGradeCount 
ORDER BY 
    table.grade 

Une jointure interne simple et pas en vue ;-) CTEs

+1

Vous utilisez 'MaxGradeCount' comme alias de colonne. 'MaxGradeCount.grade' retournera une erreur de syntaxe. – Andomar

+0

Merci @Andomar, maintenant corrigé. –

-3

Vous pouvez utiliser GroupBy combiné avec des fonctions d'agrégation - max(), count().

--Cheers

+4

Ceci est tellement basique que d'être complètement inutile. – Caveatrob

0

Vous pouvez calculer la somme par une lettre de qualité dans une expression de table commune (CTE). Ensuite, vous pouvez utiliser not exists pour filtrer uniquement les notes avec le nombre le plus élevé:

; with s as 
    (
    select course 
    ,  section 
    ,  left(grade,1) as Grade 
    ,  sum(gradeCount) sumGradeCount 
    from YourTable yt1 
    group by 
      course 
    ,  section 
    ,  left(grade,1) 
    ) 
select * 
from s s1 
where not exists 
     (
     select * 
     from s s2 
     where s1.course = s2.course 
       and s1.section = s2.section 
       and s1.sumGradeCount < s2.SumGradeCount 
     ) 
+0

Non - ne se regroupe pas correctement par classe .. – Caveatrob

+0

@Caveatrob: Corrigé en modifiant la clause 'where' dans la sous-requête, devrait fonctionner maintenant – Andomar

2

En supposant au moins SQL Server 2005 pour la CTE:

declare @Test table (
    course char(4), 
    section char(3), 
    grade char(2), 
    gradeCount int 
) 

insert into @Test 
    values ('1301','001','A',100), 
      ('1301','002','A',20), 
      ('1301','001','B',10), 
      ('1301','002','B',50), 
      ('1301','003','B',50) 

;with cteMaxGradeCount as (
    select grade, max(gradeCount) as MaxGradeCount 
     from @Test 
     group by grade 
) 
select t.course, t.SECTION, t.grade, t.gradeCount 
    from cteMaxGradeCount c 
     inner join @Test t 
      on c.grade = t.grade 
       and c.MaxGradeCount = t.gradeCount 
    order by t.grade 
+0

Retourne toutes les lignes non modifiées. Vous devez regrouper sur le parcours et la section en plus de la note. – Andomar

+0

amen !!!! Merci beaucoup!!! – Caveatrob

+0

@Andomar: Pas dans mon test simple. Je vais modifier la réponse avec mes données de test. –

Questions connexes