在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中文网其他相关文章!