我有一个包含以下表格的数据库:
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)
时
它无法执行。
答案 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
子句中选择陈述。