2016-06-27 11 views
0

を登録しよ使用して広いテーブルを変換し、私は成功せず、長い形式で新しい宛先表2に表1(ワイドフォーマット)での私のデータをピボット/変換しよう:は長いINNERは、PostgreSQLを使用して、横方向およびPostgreSQLの

私の問題の簡単な例:

表1

id_profil | no_h | P1 | P2 | P3 | Pn 
01    1  5  7  x1 ... 
01    2  7  78  x2 ... 
02    1  5  7  x3 ... 

表2、表1変換の結果:

id_profil | no_h | parametre |  valeur 
01    1   P1    5 
01    1   P2    7 
01    1   P3    x1 
01    2   P1    7  
01    2   P2    78  
01    2   P3    x2  
02    1   P1    5 
02    1   P2    7 
02    1   P3    x3  

テーブル1の構造/データは、this sqlfiddleにあります。

私はそれを行うためにINNER JOIN LATERALを使用することが可能ですいくつかのstackoverflowの投稿を参照してください。 (Postgres analogue to CROSS APPLY in SQL Serverを参照してください)しかし、正しい列名をパラメータ列に挿入するにはどうすればよいですか?実際のデータベースで

更新

、私は150の以上の列を持っているので、それは、クエリに手動で各列の名前を入力しないことも可能です場合、それはおそらく良いでしょう。

答えて

1

あなたはパラメータ名のリストとともに、valeur列のCASEを使用し、一般的なタイプ(例えばテキスト)にキャストする必要があります:私は、この最初の答えとupvoteのための

with 
    table1(id_profil, no_h, parametre1, parametre2, parametre3) as (
    VALUES (01, 1, 5, 7, 'x1'::text), 
      (01, 2, 7, 78, 'x2'), 
      (02, 1, 5, 7, 'x3') 
    ), 
    col as (
    unnest('{parametre1,parametre2,parametre3}'::text[]) 
    ) 
select t.id_profil, t.no_h, col as parametre, 
     case col when 'parametre1' then t.parametre1::text 
       when 'parametre2' then t.parametre2::text 
       when 'parametre3' then t.parametre3::text 
     end as valeur 
from col 
cross join table1 t 
order by 1, 2, 3 
+0

感謝私の質問を更新します。実際のベースでは150列以上あるので、私はそれらのそれぞれを入力することはできません... – reyman64

+0

@ reyman64 pg_attributeを使用してcolテーブルとCASEパートを作成し、 RETURN QUERY EXECUTEを使用して問合せを実行します。 –

+0

Hum thx、私は専門家ではない、私はウェブ上でQUERY EXECUTEを使用して動的ケースの例を検索しようとしている。 – reyman64

関連する問題