首页 >数据库 >mysql教程 >如何在 SQLite 中将学生评分数据从长格式转换为宽格式?

如何在 SQLite 中将学生评分数据从长格式转换为宽格式?

Barbara Streisand
Barbara Streisand原创
2025-01-10 12:46:42281浏览

How to Pivot Student Marks Data from Long to Wide Format in SQLite?

在SQLite中透视表结构

引言:

数据扁平化,也称为长格式,是SQLite中存储数据的常用方法。但是,有时需要将这些数据转换为宽格式,其中每一行代表一个科目,列代表特定学生的该科目的分数。此过程称为透视。

问题陈述:

您有两个表,一个存储学生数据(studid、name),另一个存储他们不同科目的分数(studid、subjectid、marks)。任务是以宽格式检索学生信息,其中每一行代表一个学生,列代表他们特定科目的分数。

使用CASE和GROUP BY的解决方案:

<code class="language-sql">SELECT
    si.studid,
    si.name,
    SUM(CASE WHEN md.subjectid = 3 THEN md.marks END) AS subjectid_3,
    SUM(CASE WHEN md.subjectid = 4 THEN md.marks END) AS subjectid_4,
    SUM(CASE WHEN md.subjectid = 5 THEN md.marks END) AS subjectid_5
FROM
    student_info si
JOIN
    markdetails md ON md.studid = si.studid
GROUP BY
    si.studid, si.name;</code>

此解决方案在SUM()聚合函数中使用CASE语句。对于每个subjectid(3、4、5),它检查markdetails表是否包含匹配的行,并对相应的分数求和。GROUP BY子句确保结果按学生ID和姓名分组。

使用左外连接的替代解决方案:

<code class="language-sql">SELECT
    u.stuid,
    u.name,
    s3.marks AS subjectid_3,
    s4.marks AS subjectid_4,
    s5.marks AS subjectid_5
FROM
    student_info u
LEFT OUTER JOIN
    markdetails s3 ON u.stuid = s3.stuid AND s3.subjectid = 3
LEFT OUTER JOIN
    markdetails s4 ON u.stuid = s4.stuid AND s4.subjectid = 4
LEFT OUTER JOIN
    markdetails s5 ON u.stuid = s5.stuid AND s5.subjectid = 5;</code>

此替代解决方案使用LEFT OUTER JOIN将学生与markdetails表中各自的分数匹配。对于特定科目没有分数的学生,分数列(subjectid_3、subjectid_4、subjectid_5)将返回为NULL。

以上是如何在 SQLite 中将学生评分数据从长格式转换为宽格式?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn