SQL Server中学生临时表的平均成绩

时间:2015-05-04 09:24:07

标签: sql sql-server sql-server-2008 left-join select-into

我有一个包含以下表格的数据库:

  • Students_T(SNo,SDedc,SAddress)
  • Courses_T(CNo,CDesc)
  • CoursesRegister_T(CRNo,CR_CNo,CR_SNo,CRGrade)

我需要代表以下数据:

每个学生节目:

Student desc, Course desc, Course grade, Grades average

我需要为学生注册的每门课程都这样做。

例如:

如果学生 A 已注册课程 B 且其成绩为90 并且他还注册了课程 C ,他的成绩是70,我想得到下表:

A B 90 80
A C 70 80

重要的是我需要使用SELECT INTO语法的临时表,我无法弄明白。

我正在使用SQL Server。

有人知道怎么做吗?

修改

我已经这样做了:

select CR_ST_No, ST_Desc, CR_Desc, CR_Grade
into #Grades
from Students_T
left join CoursesRegister_T on CR_ST_NO = ST_No
where CRS_Desc is not null

select *
from #Grades 
drop table #Grades

它给我提供了我需要的所有数据,除了平均值。

当我尝试将行select *更改为select *, avg(CR_Grade)时 它无法执行。

2 个答案:

答案 0 :(得分:0)

这是Window函数的典型用例。您尚未提供任何样本数据,我现在无法对其进行测试,但类似的内容应该有效:

SELECT s.SDedc, c.CDesc, r.CRGrade, AVG(r.CRGrade) OVER (PARTITION BY s.SNo) AS average_grade 
    FROM Students_T             AS s 
    LEFT JOIN CoursesRegister_T AS r ON r.CR_SNo = s.SNo 
    LEFT JOIN Courses_T         AS c ON r.CR_CNo = c.CNo;

答案 1 :(得分:0)

根据您的问题和后续评论,您需要更改select语句以包含group by子句。

请仔细阅读 MSDN SELECT (Transact-SQL) 文章,了解select语句的结构,以及每个部分的说明和示例。

您收到错误消息的原因是AVG是一个聚合函数,因此要求所有不属于聚合的列都包含在您的group by子句中选择陈述。