2016-07-25 39 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