1. ホーム
  2. sql

[解決済み] SQLiteでどのようにピボットするか、つまり、長い形式で保存されたテーブルを広い形式で選択するか?

2022-02-08 19:43:52

質問内容

生徒のデータを格納するテーブルを ロングフォーマット と、全科目の点数を1つのクエリで取得します。

これが私のテーブル構造です。

テーブル markdetails

## studid ## ## subjectid ##  ## marks ##
     A1            3                50
     A1            4                60
     A1            5                70
     B1            3                60
     B1            4                80
     C1            5                95

テーブル student info

実際の構造

## studid ##  ## name ##
      A1          Raam
      B1          Vivek
      c1          Alex

結果セットには、次のようなものが欲しい。 ワイドフォーマット 構造を持つようになります。

テーブル Student Info

## studid ## ## name## ## subjectid_3 ## ## subjectid_4 ## ## subjectid_5 ##
      A1        Raam        50                60                 70
      B1        Vivek       60                80                null
      c1        Alex       null              null                95

SQLiteでこれを実現するにはどうしたらよいでしょうか?

どのように解決するのですか?

まず、現在のテーブルをtempテーブルに変更する必要があります。

alter table student_info rename to student_name

次に student_info :

create table student_info add column (
    stuid VARCHAR(5) PRIMARY KEY,
    name VARCHAR(255),
    subjectid_3 INTEGER,
    subjectid_4 INTEGER,
    subjectid_5 INTEGER
)

次に student_info :

insert into student_info
select
    u.stuid,
    u.name,
    s3.marks as subjectid_3,
    s4.marks as subjectid_4,
    s5.marks as subjectid_5
from
    student_temp 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

では、temp テーブルを削除してください。

drop table student_temp

こうして、テーブルを素早く更新することができるのです。

SQLiteには pivot 関数があるため、左結合をハードコードするのが精一杯です。A left join は、結合条件に含まれるすべての行にマッチして null は、最初の、つまり左側のテーブルの行が、2 番目のテーブルの結合条件を満たさない場合に使用されます。