在数据库管理中,数据透视是一种将数据从长格式(每行代表具有多个属性的单个观察值)转换为宽格式(每行代表一个不同的属性,列代表这些属性的值)的技术。当处理以长格式存储数据的表(如下所示)时,此过程特别有用:
<code>## studid ## ## subjectid ## ## marks ## A1 3 50 A1 4 60 A1 5 70 B1 3 60 B1 4 80 C1 5 95</code>
问题:
目标是将上面的表转换为宽格式,其中每位学生都有一行代表他们的姓名和每门科目的分数。期望的输出应如下所示:
<code>## studid ## ## name## ## subjectid_3 ## ## subjectid_4 ## ## subjectid_5 ## A1 Raam 50 60 70 B1 Vivek 60 80 NULL C1 Alex NULL NULL 95</code>
使用 CASE 语句和 GROUP BY 子句的解决方案:
在 SQLite 中实现此目标的一种方法是结合使用 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>
使用左外连接的解决方案:
另一种方法涉及使用左外连接来组合每门科目的学生信息和分数:
<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>
这两个 SQL 查询都将生成所需的宽格式表,从而更轻松地分析和可视化数据。
以上是如何在 SQLite 中将数据从长格式转换为宽格式?的详细内容。更多信息请关注PHP中文网其他相关文章!