ホームページ >データベース >mysql チュートリアル >SQLite で生徒の成績データをロング形式からワイド形式にピボットする方法は?
SQLite のピボット テーブル構造
紹介:
ロングフォーマットとも呼ばれるデータフラット化は、SQLite にデータを保存する一般的な方法です。ただし、場合によっては、このデータをワイド形式に変換する必要があります。この形式では、各行が科目を表し、列が特定の生徒のその科目のスコアを表します。このプロセスは遠近法と呼ばれます。
問題ステートメント:
2 つのテーブルがあり、1 つは生徒のデータ (生徒、名前) を保存し、もう 1 つは異なる科目のスコア (生徒、主題 ID、マーク) を保存します。このタスクは、各行が生徒を表し、列が特定の科目での成績を表すワイド形式で生徒情報を取得することです。
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 中国語 Web サイトの他の関連記事を参照してください。