様式1ファイルを扱ってみる(2)
<注> 今回のSQLはPostgreSQLの拡張機能を使います!Postgre以外では動きません!
今回は前回作った様式1データから、横持ちのデータを取り出してみます。
やってみたいのは、以下のようなデータ抽出です。
元データ
データ識別番号 | 連番 | ペイロード9 |
---|---|---|
001 | 1 | 心不全 |
001 | 2 | 肺炎 |
001 | 3 | 狭心症 |
001 | 4 | 心房細動 |
取り出すデータ
データ識別番号 | 病名1 | 病名2 | 病名3 | 病名4 |
---|---|---|---|---|
001 | 心不全 | 肺炎 | 狭心症 | 心房細動 |
さて、どうしたものでしょうか。 ここでCASE式を活用したSQLを書けたら格好いいのですが、生憎上手く行かなかったので、PostgreSQLの拡張機能を使うことにします。 まずは以下のコードを実行してください。
CREATE EXTENSION tablefunc;
ドキュメントはこちらです。
今回はこの中のcrosstab(text, text)
関数を使います。
実際のSQLはこのようになります。
select * from crosstab('select データ識別番号,連番,ペイロード9 from ff1test Where コード = ''A006040''', 'select m from generate_series(1,10) m') AS( データ識別番号 int, 病名1 text, 病名2 text, 病名3 text, 病名4 text, 病名5 text, 病名6 text, 病名7 text, 病名8 text, 病名9 text, 病名10 text);
…何が起きたのでしょうか。
半分ドキュメントからの引き写しですが、どうやら上手く行ったようです。
結果は
データ識別番号 | 病名1 | 病名2 | 病名3 | 病名4 | —病名10 |
---|---|---|---|---|---|
001 | 心不全 | 肺炎 | 狭心症 | 心房細動 | —病名ラスト |
のようになり、しかも(賢いことに)病名が10個も入っていない場合は、自動的にNULLが入ります。
確かに目的通りの結果ですが、今まで書いてきたSQLとは大分毛色が違うシロモノで、何が何だかわからないという人も多いでしょう。
(告白すると、私はドキュメントを前にしばらく頭を抱えていました)
次回はcrosstab関数の簡単な解説をしようと思います。