两道sql创建函数与存储过程的问题

1.创建函数float sf_getAverageGrade(@sname nchar(10))。
如果没有学生叫做@sname,函数返回-1; 如果有多名学生叫做@sname,则返回-2; 如果他/她具有至少一门课程,则返回学生姓氏的平均成绩; 如果学生@sname没有课程成绩,则返回null。
参数@sname等于'李少西'时显示函数结果。

2.创建存储过程sp_displayGradeInRow(@sname nchar(10))。
存储过程显示两行信息:“姓名”一行,由@sname和“平均成绩”选择的所有课程名称,@sname的另一行,成绩和平均成绩。 (使用光标获取课程名称和成绩)
参数@sname等于'李少西'时显示存储过程结果

第一问:

create function sf_getAverageGrade(@sname nchar(10))
returns real
as
begin
DECLARE @sno nchar(10);
DECLARE @cname nchar(15);
DECLARE @grade real;
declare @avgg real;
declare @c int;
declare @d int;
set @c = (SELECT count(*)  FROM student WHERE sname=@sname)
set @d = (select count(*)  from course where cname=@cname)
if @d=0 set @avgg='null'
else if @c>0 set @avgg=(select avg(grade) from sc where sno=@sno);
else if @c>1  set @avgg= '-2';
set @avgg ='-1';
return @avgg;
end;

报错:从数据类型 varchar 转换为 real 时出错。
以及第二问
求助qwq感谢!!

else if @c>1 set @avgg= '-2';

變更為else if @c>1
set @avgg=-2

select sname,classname , avg (grade) from student a join course b on a.sname=b.cname
where a.sname in (@select_study_name)
group by sname,classname

1.数据库real类型是不精确的双精度浮点型,把引号去掉就可以了
2.select sname,classname , avg (grade) from student as s left join course as c on s.sname=c.cname
where s.sname =@sname
group by c.sname,c.classname