C# 如何按别名列值的和求和?

C# 如何按别名列值的和求和?,c#,asp.net-core-mvc,sql-server-2017,C#,Asp.net Core Mvc,Sql Server 2017,在这里,我试图计算特定学生在特定会计年度以及该会计年度每个月支付的辅导费总额。 例如,在下一行中,PaidTutionFee通过SUM(Tution)计算为PaidTutionFee。现在我要做的是求和PaidTutionFee列 StudentId FYID Month PaidTutionFee 7 16 3 2855.00 7 16 4 2855.00 为此,我将学费加总,即sum(Tuti

在这里,我试图计算特定学生在特定会计年度以及该会计年度每个月支付的辅导费总额。

例如,在下一行中,
PaidTutionFee
通过
SUM(Tution)计算为PaidTutionFee
。现在我要做的是求和
PaidTutionFee

StudentId   FYID    Month   PaidTutionFee
7           16      3       2855.00
7           16      4       2855.00
为此,我将学费加总,即
sum(Tution)作为支付学费
,并按
StudentId、FYId、Month
分组,这将给出该财年每个月的学费加总,最后加总整个财年支付的学费。我将
sum(Tution)化名加总,作为支付学费
sum(支付的手续费)作为全年的总手续费

现在的问题是我抛出了一个错误,说

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

下面是我的sql server查询

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

您不能在同一SELECT语句中聚合聚合。但是…这并不是您真正想要的。按
StudentID,FYid,Month
分组时,您需要
tutory
的总和,按
StudentID,FYid
分组时,您需要
tutory
的总和(如果我没有读错的话)。为此,您可以使用窗口功能:

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
重复,并且它的值表示您所追求的更高粒度级别的总和。

您不能在同一个SELECT st中聚合聚合atement.但是…这并不是你真正想要的。如果我读对了,你需要按
学生ID,FYid,月
分组的
学费
和按
学生ID,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
重复,它的值表示您所追求的更高粒度级别的总和。

您可以使用over Partition By来计算运行totals和总计(不需要分组):

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

您可以使用over Partition By计算运行总计和总计,而不需要group 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

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将按照您的要求进行分组,一直到月份级别,这样您将得到每个月的一行。然后,由于添加了汇总功能,您将得到一个月为空的行,这是学生/年的所有内容的总和。您还将得到一个月为空、年为空的行,这是学生的总和,以及一个包含所有空值的行是所有学生的总计。因此,分组/求和按从右到左的顺序从最精确的(学生/年/月)到最不精确的(所有项的一个求和)进行“汇总”,这取决于分组中列的顺序

我注释掉了where子句以更好地演示汇总效果-如果你将其放回,你将得到一些与你已经知道的相同的总计行(因为只有一个学生和一年,所以所有学生的总计将与一个学生的总计相同,等等)

分组集可以更好地微调小计/总计效果

如果您是这样组成您的团队的:

GROUP BY GROUPING SETS((StudentId,FyId,Month),(StudentId,FyId))

您只需获得月份详细信息(感谢第一个分组集)以及月份为空的行(一年中的第个总数),感谢第二个分组集

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将按照您的要求进行分组,一直到月份级别,这样您将得到每个月的一行。然后,由于添加了汇总功能,您将得到一个月为空的行,这是学生/年的所有内容的总和。您还将得到一个月为空、年为空的行,这是学生的总和,以及一个包含所有空值的行是所有学生的总计。因此,分组/求和按从右到左的顺序从最精确的(学生/年/月)到最不精确的(所有项的一个求和)进行“汇总”,这取决于分组中列的顺序

我注释掉了where子句以更好地演示汇总效果-如果你将其放回,你将得到一些与你已经知道的相同的总计行(因为只有一个学生和一年,所以所有学生的总计将与一个学生的总计相同,等等)

分组集可以更好地微调小计/总计效果

如果您是这样组成您的团队的:

GROUP BY GROUPING SETS((StudentId,FyId,Month),(StudentId,FyId))

您只需获得月份详细信息(感谢第一个分组集)以及月份为空的行(该年的第个总数)多亏了第二个分组集

您确实可以在同一个查询中聚合一个聚合-检查分组集/分组(按多维数据集/分组)和汇总是什么。为了我的钱,我只使用汇总,并接受学生支付的总金额作为免费赠品奖金数据line@CaiusJard这是一个很好的决定。我猜“你不能聚合一个聚合”这不是正确的说法。你不能求和(Sum(yourfield))。但是你可以向它抛出一个窗口函数(就像我在这里做的那样)或者
groupbyrollup
,您这样做了,我正在投票,因为这是一个100%的解决方案。您确实可以在同一个查询中聚合一个聚合-检查分组集/分组立方体/分组与ROLLUP是什么。为了我的钱,我只会使用ROLLUP,并接受学生支付的总额作为免费奖金数据line@CaiusJard那是好电话