2017-05-11 6 views
0

単一のテーブルの行に多くのテーブルに1から選択します。Postgresは、私は以下の表を持って

kid 
    id 
    name 

kid_workshop 
    id 
    kid_id 
    workshop_name 

workshop_nameは唯一の可能性:芸術、武道・武術、チェス、サッカー

パフォーマンスを向上させるために

kid_id name arts martial_arts chess soccer 
    1  Dann True True   False True 

どうすればいいですか?次のようなマテリアライズドビューを作成します。

create materialized view mv1 as 
select 
    k.id kidid 
, name 
, case when workshop_name = 'arts' then true else false end arts 
, case when workshop_name = 'martial_arts' then true else false end martial_arts 
, case when workshop_name = 'chess' then true else false end chess 
, case when workshop_name = 'soccer' then true else false end soccer 
from kid k 
join kid_workshop w on w.kid_id = k.id 
+0

あなたは 'kid_id'カラムでピボットを要求しています。私はこれが非常に功績があるとは思わない。いずれにしても、これまでに何を試しましたか? –

+0

ピボットを意味しますか? – Dejell

+0

1行表示、または多くの行を1つにしたいですか? –

答えて

1

は、次のクエリを試してみてください。

create materialized view your_view as 
select 
    k.id, 
    k.name, 
    max(case when kw.workshop_name = 'arts' 
      then 'true' else 'false' end) arts, 
    max(case when kw.workshop_name = 'martial_arts' 
      then 'true' else 'false' end) martial_arts, 
    max(case when kw.workshop_name = 'chess' 
      then 'true' else 'false' end) chess, 
    max(case when kw.workshop_name = 'soccer' 
      then 'true' else 'false' end) soccer 
from kid k 
inner join kid_workshop kw 
    on k.id = kw.kid_id 
group by k.id, 
     k.name 

ピボットをしている間、このクエリはトリックを採用して、私はpostgresの

+0

なぜグループ化する必要がありますか?ありがとうTim – Dejell

+0

これは単なる標準的なピボットクエリの質問です。それぞれの 'kid_id'に対応するレコードのコレクションがあり、これらのレコードを列にピボットする必要があります。これを行う方法は、それぞれの 'kid_id'を集計し、各データを格納する列を作成することです。 –

+0

エラーが発生しました。function max(boolean)が存在しません – Dejell

1

なめらかなどを使用しています。具体的には、肯定の場合は'true'、負の場合は'false'の文字列を割り当てます。 'true'は辞書学的には'false'より大きいため、存在する場合はMAX()関数を使用して保持する必要があります。そうでない場合はfalseが報告されます。これはまさに私たちが求めている論理です。

+0

あなたは 'GROUP BY'を忘れましたが、私たちはまだこれに答えるべきではないと感じています。 –

+0

なぜグループ化しますか? OPはbool_andをこれらのフィールドに渡したいですか?私は彼が長いリストを望んでいると思った。 –

+0

いいえ...あなたはそれぞれの 'kid_id'に対して_aggregate_しピボットを行う必要があります。これは私の気持ちです。 –

1

試してみてください:

select 
    k.id kid_id, 
    k.name, 
    a.id is not null as arts, 
    m.id is not null as martial_arts, 
    c.id is not null as chess, 
    s.id is not null as soccer 
from kid k 
    outer join kid_workshop a on a.kid_id = k.id and a.workshop_name = 'arts' 
    outer join kid_workshop m on m.kid_id = k.id and m.workshop_name = 'martial arts' 
    outer join kid_workshop c on c.kid_id = k.id and c.workshop_name = 'chess' 
    outer join kid_workshop s on s.kid_id = k.id and s.workshop_name = 'soccer' 
関連する問題