Значительно недооцененные возможности набора и объединения наборов sqlserver могут сделать это довольно легко:
SELECT StudentId,FYId, Month, SUM(Tution) AS PaidTutionFee
Sum(Tution) OVER (PARTITION BY SutdentID, FyID) as TotalTutionFeeInFiscalYear
FROM [dbo].[FeePaymentDetails]
/*WHERE FYId = 16 AND StudentId = 7*/
GROUP BY ROLLUP(StudentId, FYId, Month)
Я выбрал ROLLUP, потому что я думаю, что его легче понять
Sqlserver будетделайте свою группировку так, как вы просите, до уровня месяца, чтобы вы получали строки за каждый месяц.Тогда, благодаря добавлению ROLLUP, вы получите строку с нулевым месяцем, и это сумма всего за студента / год.Вы также получите строку с нулевым месяцем и нулевым годом, которая является суммой для студента, и строку всех нулей, которая является общей суммой для всех студентов.Таким образом, эффект состоит в том, что группировка / суммирование «сворачивается» от наиболее точного (студент / год / месяц) до наименее точного (одна сумма всего) в порядке справа налево в зависимости от порядка столбцов в группеby
Я прокомментировал ваше предложение where, чтобы лучше продемонстрировать эффект свертки - если вы вернете его обратно, вы получите несколько итоговых строк, которые не отличаются от того, что вы уже знаете (потому что есть только один студент иодин год, поэтому итоговое значение для всех учащихся будет таким же, как и для одного учащегося и т. д.)
ГРУППОВЫЕ НАБОРЫ позволяют более точно настроить эффект промежуточного итога / итогового значения
Если вы сделали свойсгруппировать так:
GROUP BY GROUPING SETS((StudentId,FyId,Month),(StudentId,FyId))
Вы получите данные о месяце (благодаря первому набору группировки) и строки, в которых месяц равен нулю (общее число за год) благодаря второму набору группировки