选择平均交叉列

时间:2013-10-31 08:48:40

标签: mysql select average coalesce isnull

我希望你们中的一位能够帮助我解决我的问题。

我正在构建一个简单的课程管理程序,它能够存储学员数据,如姓名,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'”;

如果有人可以提出更好的方法,比如创建更多的表格,请随时提出建议。

此致

亚切克

2 个答案:

答案 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'