【问题标题】:SELECT AVERAGE ACROSS COLUMNS跨列选择平均值
【发布时间】:2013-10-31 08:48:40
【问题描述】:

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

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

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

我的表格结构如下:

user_id |姓名 |开始日期 |团队 |课程1 | course1_date | course1_评估 |课程2 | course2_date | course2 评估 |课程3 | course3_date | course3_评估 |等等……

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

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

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

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

问候

杰克

【问题讨论】:

  • 更好的方法是规范化你的架构开始。

标签: mysql select average coalesce isnull


【解决方案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;

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

【讨论】:

    【解决方案2】:

    按照建议,最好的方法是规范化您的表格。

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

    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'
    

    【讨论】:

    • 感谢大家的建议。现在我的问题是,我真的需要课程表吗?它似乎复制了评估表中的字段。
    • 这是我的问题吗?如果是这样,我不是在批评任何人,只是想知道这是否是最好的方法,因为我想避免创建太多表。
    • @Jack 如果一门课程从来没有超过一次评​​估,那么您可以将成绩放在课程表上。如果课程有多个评估,评估和课程必须分开。用户,你绝对应该有课程。
    • 谢谢凯文;每门课程确实会有一个评估,所以我想在这种情况下会有两张桌子。我希望能够做到以下几点:1.输入学员详细信息(姓名,开始日期,部门),2.提取学员详细信息(姓名,开始日期,部门,参加的课程+相关评估分数),3.提取各种矩阵:即受训者参加的所有课程的平均评估分数,所有受训者参加的给定课程的平均评估分数,4. 显示每门课程的失败次数(85% 将是及格分数),5. 创建一个学员应参加课程时的警报系统
    猜你喜欢
    • 1970-01-01
    • 2021-07-08
    • 2016-09-04
    • 2022-06-14
    • 2020-01-03
    • 2013-10-30
    • 2021-07-27
    • 1970-01-01
    • 2019-01-21
    相关资源
    最近更新 更多