2016-07-25 36 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本身就是一個聚集函數;它通常在沒有聚合的情況下使用(只有一個值需要旋轉),然後可以使用'max()'或'min()',因爲vkp在他的解決方案中已經顯示出來。 PIVOT不是爲轉置表而創建的;它是爲了在「文本」列中可能有數字(美元數量等)的情況而創建的,每個「id」 - 「language」組合中有多行,並且將使用pivoting來將這些數字加起來,或者找到平均等等。所以 - 當你使用PIVOT來轉置表時,你仍然必須使用'max()'或'min()'。 – mathguy

回答

2

假設每個語言每個語言有一個文本,可以在pivot的文本列上使用maxmin

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

編輯:基於OP的評論我有麻煩搞清楚SELECT查詢是如何工作的,如果我不希望選擇在這種情況下的一切。 SELECT something,text FROM tablename or similar is not working

請記住,您應該選擇所有列爲pivot ing。

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

我相信這會把列名放在雙引號中。通過在列表中的每列中包含別名,可以避免這種情況(如果需要的話)。 – mathguy

+1

你是正確的(列名將用單引號,儘管沒有別名)。我編輯了答案。 –

+0

這工作,謝謝。然而,如果我不想在這種情況下選擇所有的東西,我很難弄清楚「SELECT」查詢是如何工作的。 'SELECT something,text FROM tablename'或類似的不起作用。你能否提供一個例子? – OldMcDonald