Как найти сумму по значению столбца суммы псевдонимов? - PullRequest
0 голосов
/ 17 октября 2018

Здесь я пытаюсь вычислить SUM суммы, уплаченной за обучение конкретному студенту в конкретном финансовом году, а также за каждый месяц этого финансового года.

Например, в строке ниже PaidTutionFee естьрассчитывается по SUM(Tution) AS PaidTutionFee.Теперь я хочу суммировать столбец PaidTutionFee,

StudentId   FYID    Month   PaidTutionFee
7           16      3       2855.00
7           16      4       2855.00

. Для этого у меня есть сумма за обучение, т.е. SUM(Tution) AS PaidTutionFee и группировка по StudentId, FYId, Month, которая будет давать сумму обучения за каждый месяц для этогоФинансовый год и, наконец, общая сумма. Плата за весь финансовый год у меня есть псевдоним SUM(Tution) AS PaidTutionFee, то есть SUM(PaidTutionFee) AS TotalTutionFeeInFiscalYear.

Теперь проблема в том, что я выдаю ошибку, говоря:

Msg 207, Level 16, State 1, Line 11
Invalid column name 'PaidTutionFee'.


Ниже приведен мой запрос к серверу sql

SELECT StudentId,FYId, Month, SUM(Tution) AS PaidTutionFee, 
SUM(PaidTutionFee) AS TotalTutionFeeInFiscalYear
FROM [dbo].[FeePaymentDetails]
WHERE FYId = 16 AND StudentId = 7 
GROUP BY StudentId, FYId, Month

Ответы [ 3 ]

0 голосов
/ 18 октября 2018

Вы можете использовать над Разделением By для расчета промежуточных и общих итогов без необходимости группировки по:

SELECT StudentId,FYId, Month, SUM(Tuition) over (partition by StudentId, FyId) AS PaidTutionFee, 
SUM(Tution) over (partition by StudentId, Year(FyId)) AS TotalTutionFeeInFiscalYear
FROM [dbo].[FeePaymentDetails]
WHERE FYId = 16 AND StudentId = 7 
Order BY StudentId, FYId, Month
0 голосов
/ 18 октября 2018

Значительно недооцененные возможности набора и объединения наборов 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))

Вы получите данные о месяце (благодаря первому набору группировки) и строки, в которых месяц равен нулю (общее число за год) благодаря второму набору группировки

0 голосов
/ 17 октября 2018

Вы не можете агрегировать агрегат в одном и том же операторе SELECT.НО ... это не совсем то, что вы после здесь.Вам нужна сумма tuition при группировке по StudentID, FYid, Month И сумма tuition при группировке по StudentID, FYid (если я правильно читаю).Для этого вы можете использовать функции окна:

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 StudentId, FYId, Month;

Теперь гранулярность вашего результирующего набора находится на уровне StudentId, FYId, Month, но у вас есть один дополнительный столбец, значения которого повторяются для каждого отдельного StudentId, FYId, и это значениепредставляет сумму для того более высокого уровня детализации, который вы ищете.

...