2015-06-06 2 views
0

У меня есть запрос с именем «QueryTotalGrades», который имеет три поля (Group, StudentID и Mark). каждый studentID имеет более одного знака. То, что я хочу сделать, это создать еще один запрос, провести следующее:Отображение первых двух суммированных значений по группе

1- Sum mark for each studentID as a sumOfMark (Descending order) 
2- Display the top 2 of sumOfMarks per group. 

Пример: пусть говорят, что «QueryTotalGrades» имеет следующие значения. Я не буду использовать доступ Microsoft 2013

Group StudentID  Mark 
1   1   8 
1   1   7 
1   1   8 
1   2   7 
1   2   7 
1   2   7 
1   3   9 
1   3   9 
1   3   9 
2   4   5 
2   4   7 
2   4   5 
2   5   7 
2   5   7 
2   5   7 
2   6   6 
2   6   6 
2   6   6 
3   7   8 
3   7   7 
3   7   8 
3   8   7 
3   8   7 
3   8   7 
3   9   10 
3   9   10 
3   9   10 

, поэтому вывод, что я хочу, должен быть следующим

Group StudentID  SumOfMark 
1   3   27 
1   1   23 
2   5   21 
2   6   18  
3   9   30 
3   7   23 

Я пробовал много решений, но не помогло. HELP

+0

Что когда-либо у попытались, доля с нами. – Bikku

ответ

1

Немного longwinded но:

select 
    t1.[Group], t1.StudentID, t1.SumOfMark 
from 

    (select [Group], StudentID, sum(Mark) as SumOfMark 
    from QueryTotalGrades 
    group by [Group], StudentID) as t1 

where 

    (select count(*) from 

     (select [Group], StudentID, sum(Mark) as SumOfMark 
     from QueryTotalGrades 
     group by [Group], StudentID) as t2 

     where 
      t2.[Group] = t1.[Group] and 
      t2.SumOfMark >= t1.SumOfMark) <= 2 

order by 
    t1.[Group], t1.SumOfMark desc 

Вы можете играть с ним здесь: SQL Fiddle

+0

Gustav, Благодарим вас за повтор. Я пробовал ваш код, но он возвращает более 2 значений для каждой группы. Кроме того, он возвращает нулевые значения в каждой группе – FSm

+0

. Тогда данные, вероятно, отличаются от образца. Запрос в SQL Fiddle возвращает именно ваш желаемый результат. – Gustav

+0

Разница, но все они цифры – FSm

0

Запрос

;with cte as 
(
    select rn=row_number() over 
    (
     partition by [Group] 
     order by sum(Mark) desc 
    ), 
    [Group],StudentID, 
    sum(Mark) as SumOfMark 
    from student 
    group by [Group],StudentID 
) 
select [Group],StudentId,SumOfMark from cte where rn in (1,2); 

fiddle demo

+0

Благодарим вас за ответ, но я получил сообщение об ошибке 'Invalid SQL statement; ожидаемые «delete», «insert» и т. д. ' – FSm

+1

Это потому, что это T-SQL, а не Access SQL. – Gustav

Смежные вопросы