ホームページ >データベース >mysql チュートリアル >SQLite で生徒の成績データをロング形式からワイド形式にピボットする方法は?

SQLite で生徒の成績データをロング形式からワイド形式にピボットする方法は?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-10 12:46:42283ブラウズ

How to Pivot Student Marks Data from Long to Wide Format in 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。