【发布时间】:2018-12-03 07:24:31
【问题描述】:
我正在使用聚合函数来计算特定学生的 GPA。我有三个表:COURSE、SECTION 和 ENROLL。这些表是这样创建的:
create table COURSE
(
Cno varchar(9) primary key,
Cname varchar(50),
Credit int check (Credit > 0)
);
create table SECTION
(
Cno varchar(9) REFERENCES COURSE(cno),
Sno varchar(9),
Semester varchar(15) check(Semester in('Fall','Spring','Summer')),
Year int,
Sid varchar(9) primary key
);
create table ENROLL
(
Mno varchar(9) REFERENCES STUDENT(Mno),
Sid varchar(9) REFERENCES SECTION(Sid),
Grade CHAR check(Grade in('A','B','C','D','F')),
primary key(Mno,Sid)
);
我必须将 ENROLL 表中的 char Grade 转换为浮点值。在我的情况下计算 GPA 的方法是:
SUM(grade of each course*credit hours of the course)/SUM(credit hours of each course)
这是我目前尝试计算 GPA 的方式:
@grade =
(
(select SUM(CASE
WHEN Grade = 'A' THEN 4.0
WHEN Grade = 'B' THEN 3.0
WHEN Grade = 'C' THEN 2.0
WHEN Grade = 'D' THEN 1.0
WHEN Grade = 'F' THEN 0.0
END
* (
select c.Credit from COURSE c where c.Cno = (
select s.Cno from SECTION s where s.Sid in (
select Sid from ENROLL where Mno = @mNum
)
)
)
) FROM ENROLL
where Mno = @mNum
) / (
select SUM(Credit) from COURSE c where c.Cno = (
select s.Cno from SECTION s where s.Sid in (
select Sid from ENROLL where Mno = @mNum
)
) group by c.Cno
)
)
然而,有一个明显的问题。聚合函数中不能有子查询,所以我很难找到替代方法。任何帮助将不胜感激。
【问题讨论】:
-
哪个表包含学时?
-
对不起,我漏掉了!我正在使用 SQL Server 并编辑了帖子以反映这一点。
-
COURSE 包含学分。这是
Credit列名 -
使用
join代替子查询..
标签: sql sql-server group-by aggregate-functions