Sql 获取计数与类别的最大(计数)匹配的记录

Sql 获取计数与类别的最大(计数)匹配的记录,sql,sql-server,tsql,aggregate-functions,Sql,Sql Server,Tsql,Aggregate Functions,给定以下课程行、区段、等级、课程区段内的等级计数: 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-

给定以下课程行、区段、等级、课程区段内的等级计数:

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
我想得到一份每个年级数量最多的课程/章节列表

例如:

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

领带应该出现在列表中。

您可以将GroupBy与聚合函数-max、count结合使用


-Cheers

您可以在一个通用表表达式CTE中计算每一个字母等级的总和。然后,您可以使用“不存在”仅筛选出计数最高的等级:

; 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
        )

假设至少有SQL Server 2005用于:


假设成绩计数已经是每个独特课程、部分和成绩的总成绩

首先找出每个等级的最高计数

SELECT
    grade,
    Max(gradeCount) as MaxGradeCount
FROM
    table
然后查找原始表中具有最大坡度的行

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

一个简单的内部连接,看不到CTE;-

你的输入与你的输出完全不匹配。你是不是把所有的分数都当作一样,就像A-和A+都是A的一样。该死的。我为一所大学的评分系统工作!!这不是@$家庭作业。@Caveatrob:通过更改子查询中的where子句修复,现在应该可以工作了。这太基本了,完全没有帮助。返回所有未修改的行。除了成绩外,你还必须在课程和部分上分组。@Andomar:在我的简单测试中不是这样的。我将用我的测试数据编辑答案。@Joe Stefanelli:在测试数据中添加'1301','003','A',100。现在,它将显示课程1301第003节的A级计数100和B级计数50。@Andomar:按照我对问题的解释,这是有效的。当然,一个班级/部门最多有一个以上的字母等级是可能的。@Joe Stefanelli:在我给出的例子中,B级的计数为50,a级的计数为100。对于明显不正确的答案,它不应返回B-1级。您正在使用MaxGradeCount作为列别名。MaxGradeCount.grade将返回语法错误。
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