C# 如何获取数据透视表中列的平均值
我刚刚学会了透视表的概念,有人帮我想出了创建透视表的代码:(我添加了用于平均值的代码) 四个表及其列如下: 主题表列:SubjectID,SubjectName 学生表列:StudentID、Fname、Lname 检查表列:ExamID、ExamDate、ExamPeriod、Class ExamResults列:ExamResultID、ExamID、StudentID、SubjectID、ResultC# 如何获取数据透视表中列的平均值,c#,sql-server,C#,Sql Server,我刚刚学会了透视表的概念,有人帮我想出了创建透视表的代码:(我添加了用于平均值的代码) 四个表及其列如下: 主题表列:SubjectID,SubjectName 学生表列:StudentID、Fname、Lname 检查表列:ExamID、ExamDate、ExamPeriod、Class ExamResults列:ExamResultID、ExamID、StudentID、SubjectID、Result 问题是,Average列没有返回任何值。我正在使用sql server。请您帮我确定我做
问题是,Average列没有返回任何值。我正在使用sql server。请您帮我确定我做错了什么?我建议您在
Pivot
源查询中查找结果的总数和平均值
SELECT pvt.Fname,
pvt.Lname,
pvt.[English],
pvt.[Mathematics],
pvt.[Geography],
pvt.[Literature],
pvt.[French],
TotalScore,
AverageScore
FROM (SELECT s.SubjectName,
er.Result,
su.Fname,
su.Lname,
TotalScore = Sum(Result)OVER(partition BY Fname, Lname),
AverageScore = Avg(Result)OVER(partition BY Fname, Lname)
//AverageScore = Sum(Result)OVER(partition BY Fname, Lname)/5 If you want average for all the subjects
FROM Subject AS s
INNER JOIN ExamResults AS er
ON s.SubjectID = er.SubjectID
INNER JOIN Exam AS e
ON er.ExamID = e.ExamID
LEFT JOIN Student AS su
ON er.StudentID = su.StudentID
WHERE e.Class = @Class) AS e
PIVOT ( Max([Result])
FOR [SubjectName] IN ([English],
[Mathematics],
[Geography],
[Literature],
[French]) ) AS pvt;
您是否可以添加示例数据和预期输出/5而不是AVG表格在这里@nodisplayname在平均函数中求和主题时,使用“ISNULL”以避免任何求和错误。如SARATH所说,将平均数除以受试者总数。@SarathAvanavu-干得好。即使OP也不想回复你的答案,但是,我得到了一个错误:“列名'Result'无效……我想平均值不为null的主题……我认为Avg()应该忽略这些值?所以在这种情况下,我不能使用5的除法
SELECT pvt.Fname,
pvt.Lname,
pvt.[English],
pvt.[Mathematics],
pvt.[Geography],
pvt.[Literature],
pvt.[French],
TotalScore,
AverageScore
FROM (SELECT s.SubjectName,
er.Result,
su.Fname,
su.Lname,
TotalScore = Sum(Result)OVER(partition BY Fname, Lname),
AverageScore = Avg(Result)OVER(partition BY Fname, Lname)
//AverageScore = Sum(Result)OVER(partition BY Fname, Lname)/5 If you want average for all the subjects
FROM Subject AS s
INNER JOIN ExamResults AS er
ON s.SubjectID = er.SubjectID
INNER JOIN Exam AS e
ON er.ExamID = e.ExamID
LEFT JOIN Student AS su
ON er.StudentID = su.StudentID
WHERE e.Class = @Class) AS e
PIVOT ( Max([Result])
FOR [SubjectName] IN ([English],
[Mathematics],
[Geography],
[Literature],
[French]) ) AS pvt;