C# 如何获取数据透视表中列的平均值

C# 如何获取数据透视表中列的平均值,c#,sql-server,C#,Sql Server,我刚刚学会了透视表的概念,有人帮我想出了创建透视表的代码:(我添加了用于平均值的代码) 四个表及其列如下: 主题表列:SubjectID,SubjectName 学生表列:StudentID、Fname、Lname 检查表列:ExamID、ExamDate、ExamPeriod、Class ExamResults列:ExamResultID、ExamID、StudentID、SubjectID、Result 问题是,Average列没有返回任何值。我正在使用sql server。请您帮我确定我做

我刚刚学会了透视表的概念,有人帮我想出了创建透视表的代码:(我添加了用于平均值的代码)

四个表及其列如下: 主题表列:SubjectID,SubjectName

学生表列:StudentID、Fname、Lname

检查表列:ExamID、ExamDate、ExamPeriod、Class

ExamResults列:ExamResultID、ExamID、StudentID、SubjectID、Result


问题是,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;