我希望你们中的一位能够帮助我解决我的问题。
我正在构建一个简单的课程管理程序,它能够存储学员数据,如姓名,start_date,course_duration等。其中一个关键领域是课程选择,日期和评估分数。
现在我想创建一个函数来检索用户所有评估课程的平均值。
我通过以下方式构建了我的表:
user_id |名字| start_date |团队| course1 | course1_date | course1_assessment | course2 | course2_date |课程2评估| course3 | course3_date | course3_assessment |等...
现在我在构建SELECT函数时出现问题,该函数为所有评估提供了正确的平均值。当所有字段都被填充时,一切都很好,但可能发生的是,受训者还没有参加过一些课程,但平均需要拔出任何一个(如果例如,course2_assessment字段为NULL)
我正在努力做某事。像:
“SELECT COALESCE(course1_assessment,course2_assessment,course3_assessment)/(只有COALESCE(数组)中的一些字段带有VALUES!= NULL)FROM表WHERE name ='$ name'”;
如果有人可以提出更好的方法,比如创建更多的表格,请随时提出建议。
此致
亚切克
答案 0 :(得分:1)
您可能想要修改数据模型。我可以看到至少有三张表可以从你提到的表格中删除。
create table user(
user_id int,
name varchar
);
create table course(
course_id int,
name varchar
);
create table assessment(
assessment_id int,
user_id int,
course_id int,
name varchar,
grade int
);
然后获得平均成绩:
select avg(grade) as grade, user_id
from assessment
group by user_id;
此数据模型将阻止您在每次创建新课程/评估时向表中添加列。相反,新的评估将在评估表中产生一行。
答案 1 :(得分:-1)
最好的方法是按照建议将表格标准化。
作为第二个答案,这可以让您保留当前的架构。
在SQL Server中没有MYSQL中的PIVOT,但这本来不错。
SELECT AVG(assessment)
FROM (
SELECT name, course1_assesment assessment FROM `table` WHERE course1_assessment IS NOT NULL
UNION ALL
SELECT name, course2_assesment FROM `table` WHERE course2_assessment IS NOT NULL
UNION ALL
SELECT name, course3_assesment FROM `table` WHERE course3_assessment IS NOT NULL
) t
WHERE name = 'name'