0

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

我正在构建一个简单的课程管理程序,它能够存储学员数据,例如姓名、开始日期、课程持续时间等。其中一个关键领域是课程的选择、日期和评估分数。

现在我想创建一个函数来检索用户参加的所有评估课程的平均值。

我按以下方式构建我的表:

用户 ID | 姓名 | 开始日期 | 团队 | 课程1 | course1_date | course1_评估 | 课程2 | course2_date | course2 评估 | 课程3 | course3_date | course3_评估 | ETC...

现在我在构建 SELECT 函数时遇到了问题,该函数为我提供了所有评估的正确平均值。填充所有字段时一切都很好,但可能会发生受训者尚未参加某些课程,但无论如何都需要提取平均值(如果即 course2_assessment 字段为 NULL)

我正在尝试做某事。喜欢:

"SELECT COALESCE(course1_assessment, course2_assessment, course3_assessment)/ (只有 COALESCE(Array) 中的一些字段,VALUES != NULL) FROM table WHERE name='$name'";

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

问候

亚采克

4

2 回答 2

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;

此数据模型将阻止您在每次创建新课程/评估时向表中添加列。相反,新的评估将在评估表中产生一行。

于 2013-10-31T08:53:53.147 回答
-1

正如建议的那样,最好的方法是规范化您的表格。

作为第二个答案,这使您可以保留当前架构。

MYSQL 中没有像 SQL Server 中那样的 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'
于 2013-10-31T08:56:10.097 回答