2016-05-19 10 views
0

私はこのテーブルを入力していますが、常に3つの行しか含んでいません。Postgres 9.5で列を列に転記する方法は?

| data | 
-------- 
| X | 
| Y | 
| Z | 

そして、私はこの出力をしたい:

| data1| data2 | data3 | 
-------+-------+-------+ 
| X | Y | Z | 

私はcrosstab機能を使用しようとしましたが、私の知る限り理解し、それは、カテゴリ欄とROW_NAME欄のように、より多くの情報が必要。私はそれらを持っていません。

この表を転置することはできますか?

答えて

0

あなただけのシンプルなPIVOTクエリを使用し、これを行うには、クロス集計機能を必要としません:

SELECT max(case rn when 1 then data end) as data1, 
     max(case rn when 2 then data end) as data2, 
     max(case rn when 3 then data end) as data3 
FROM (
    SELECT *, 
      row_number() over (ORDER BY data) rn 
    FROM table1 
) x 

デモ:http://sqlfiddle.com/#!15/bead8/4


必要にこのクエリ内の1つの落とし穴がありますについて考える。
データベーステーブルは定義上、順序付けられていない集合です。テーブルを照会するSELECT文でORDER BY句が指定されていない限り、ほとんどのデータベースで行の順序が保証されることはほとんどありません。このため
クエリはXは(X < Y < Z becauce)の順に、data3data1カラム、Ydata2およびZに置かれることを、このような方法で行を注文するORDER BY data句を使用します。
この句を変更する必要がある場合は、他の順序を使用する必要がある場合(またはこの順序を決定するためにこの表の他の列を使用する場合)です。固定列/行はカウントに

0

select 
    data[1] as data1, 
    data[2] as data2, 
    data[3] as data3 
from 
    (select array_agg(data) as data from t) as t; 

変数の列/行が(一つだけ多くの可能性から)カウントについて:その後、

create function prepare_statement(in p_name text, in p_body text) returns void as $$ 
declare 
    s text; 
begin 
    s := 'prepare ' || p_name || ' as ' || p_body; 
    execute s; 
    return; 
end; $$ language plpgsql; 

と:

select prepare_statement('foo', (
    select 
    'select ' || 
    string_agg('data['||i||'] as data'||i, ', ') || 
    ' from (select array_agg(data) as data from t) as t' 
    from generate_series(1, (select count(*) from t)) n(i)) 
); 

execute foo; 

-- deallocate foo; -- to deallocate previously prepared statement 

読みます
の詳細 arrays
array_agg function
prepare/execute/deallocate statements

関連する問題