【问题标题】:Average grade of student temporary table in SQL ServerSQL Server中学生临时表的平均成绩
【发布时间】:2015-05-04 09:24:06
【问题描述】:

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

  • Students_T (SNo, SDedc, SAAddress)
  • 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) 它无法执行。

【问题讨论】:

  • “我想不通。”弄清楚什么?如何使用临时表?如何选择临时表?
  • “它无法执行”,为什么不呢?错误信息是什么,错误告诉你什么?
  • 据说 - “列 '#Grades.CR_ST_No' 在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。”
  • 那条错误信息告诉你什么?它表示什么?
  • 但 #Grades.CR_ST_No 是 group by 的一部分。如果我能很好地理解该组的含义。

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


【解决方案1】:

这是窗口函数的典型用例。您尚未提供任何示例数据,我现在无法对其进行测试,但类似的方法应该可以:

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;

【讨论】:

    【解决方案2】:

    根据您的问题和后续的 cmets,您需要更改您的选择语句以包含 group by 子句。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-10
      • 2021-01-16
      • 1970-01-01
      相关资源
      最近更新 更多