Получить записи, чье количество соответствует максимальному (количеству) для категории - PullRequest
0 голосов
/ 26 октября 2010

Учитывая следующие строки курса, секции, оценки, количества оценок в пределах секции курса:

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

Галочки должны появиться в списке.

Ответы [ 4 ]

2 голосов
/ 26 октября 2010

Предполагается, что по крайней мере SQL Server 2005 для 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
1 голос
/ 26 октября 2010

Предполагая, что gradeCount уже является суммой оценок за каждый уникальный курс, раздел и оценку.

Сначала найдите наибольшее количество для каждого сорта

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 в поле зрения ;-)

0 голосов
/ 26 октября 2010

Вы можете рассчитать сумму за однобуквенную оценку в общем табличном выражении (CTE). Затем вы можете использовать not exists, чтобы отфильтровать только оценки с наибольшим количеством:

; 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 голосов
/ 26 октября 2010

Вы можете использовать GroupBy в сочетании с агрегатными функциями - max (), count ().

- Приветствия

...