2016-07-25 8 views
1

Oracle 11gの列として一部の行を表示できるかどうかは疑問でした。Oracle SQL - 行の列

は、私はこのように表示されるように、次の

id  language  text 
-------------------------- 
1  english  some example 
1  german  an example 
2  english  test 
2  german  test123 

にしたい:

id  english  german 
--------------------------------- 
1  some example an example 
2  test   test123 

私はpivotを使用してみましたが、それを正しく処理する方法を見つけ出すことができなかった、pivotが必要となるため集合関数。

+1

全体のポイントだ... PIVOT自体は集約関数です。 vkpが彼の解決策で示したように、集約なしで(たぶん1つの値だけをピボットさせて)使用してから、 'max()'や 'min()'を使うことができます。テーブルを転置するためにPIVOTは作成されませんでした。これは、 "text"列に数値(ドルの金額など)があり、 'id' - ' language'の組み合わせごとに複数の行がある状況で作成されました。ピボットを使用してそれらの数値を追加するか、つまり、PIVOTを使ってテーブルを転置するときには、 'max()'や 'min()'を使う必要があります。 – mathguy

答えて

2

IDごとに1つのテキストがあると仮定すると、pivotのテキスト列にmaxまたはminを使用できます。

select * from tablename 
pivot 
(max(text) for language in ('english' as ENGLISH,'german' as GERMAN)) 

EDIT:OPさんのコメントに基づいて、私はトラブル私はそのような場合には、すべてを選択したくない場合は、SELECTクエリがどのように機能するかを考え出すを抱えています。何かを選択すると、テーブル名などのテキストが機能しない

pivotですすべての列を選択することを忘れないでください。

select * from 
(select text,language,id,something from tablename) t 
pivot 
(max(text) for language in ('english' as ENGLISH,'german' as GERMAN)) 

編集: unpivotするために使用する

select * 
from (
select * from 
(select text,language,id,something from tablename) t 
pivot 
(max(text) for language in ('english' as ENGLISH,'german' as GERMAN)) 
) p 
unpivot (text for language in (ENGLISH, GERMAN)) 
+2

これは、二重引用符で列名を配置すると考えています。 'for language in(...)'節に、リスト内の各列のエイリアスを含めることで回避できます(希望の場合)。 – mathguy

+1

あなたは正しいです(カラム名はエイリアスなしでもシングルクォートで表示されます).iは答えを編集しました。 –

+0

これは動作します、ありがとうございます。しかし、その場合にすべてを選択したくない場合は、 'SELECT'クエリがどのように機能するかを調べるのに問題があります。 'SELECT something、text FROM tablename'などは動作しません。あなたはそれについても例を挙げることができますか? – OldMcDonald