2014-07-09 47 views
0

考虑下表#document_fields如何将UNPIVOT列转化为行?

id x y z 
------------------ 
1 foo bar baz 
2 one two three 
3 aaa bbb ccc 
4 123 456 789 

列的数目可能会有所不同,因为这样做的列名。我需要的列转动到行这样的:

id field value 
--------------- 
1 x  foo 
1 y  bar 
1 z  baz 
2 x  one 
2 y  two 
2 z  three 
. 
. 
3 z  789 

我想了解在SQL Server的作品转动方式,但不能得到任何比这再:

select 
     * 
into 
     #document_fields_pivot 
from (
     select * from (
      select * 
      from #document_fields 
    ) t 
     pivot (
      -- ?? 
    ) p 
) tbl 

任何人都可以帮我完成这个查询/解释我pivoting?任何帮助是极大的赞赏。

回答

2

你想要什么叫做UNPIVOT,做像这样:

select id,field,value from 
#document_fields 
unpivot 
(
value 
for field in (x,y,z) 
) as u 
order by id,field 

Demo

+0

谢谢!但我收到了一个错误:列“y”的类型与UNPIVOT列表中指定的其他列的类型冲突。我在另一个线程中读取这是因为所有的列必须具有相同的数据类型和长度。在这个例子中,是否有一种快速遍历列(x,y和z,但据说可能还有数以百计)的快速方法,并将它们全部转换为相同的数据记录和长度? – Pr0no

+0

不是我所知道的。不过,我很好奇你为什么会在你的桌子上有这种结构。我的意思是你不应该在一个专栏中有文字和数字吗?或者我错过了一些简单的东西? –

+0

是的,它真的很简单:)客户希望以这种格式进行数据转储,以便在Excel中轻松过滤。所以这个脚本只是生成那个excel。当然,实际上所有的东西都应该存储:) – Pr0no

1
DECLARE @Component table (ComponentId INT,Descr VARCHAR(10),Descr1 VARCHAR(10),Descr2 VARCHAR(10)) 
INSERT INTO @Component (ComponentId,Descr,Descr1,Descr2)values (1,'foo','bar','baz') 
INSERT INTO @Component (ComponentId,Descr,Descr1,Descr2)values (2,'one','two','three') 
INSERT INTO @Component (ComponentId,Descr,Descr1,Descr2)values (3,'aaa','bbb','ccc') 
INSERT INTO @Component (ComponentId,Descr,Descr1,Descr2)values (3,'123','456','789') 


    select 
     ComponentId,Field 
    from @Component P 

UNPIVOT 
(
    Field 
    FOR Value 
    IN (
    [Descr],[Descr1],[Descr2] 
    ) 
) PivotTable; 
+0

谢谢!但我得到一个错误:'列的类型“y”与在UNPIVOT列表中指定的其他列的类型冲突。我在另一个线程中读取这是因为所有的列必须具有相同的数据类型和长度。在这个例子中,是否有一种快速遍历列(x,y和z,但据说可能还有数以百计)的快速方法,并将它们全部转换为相同的数据记录和长度? – Pr0no

+0

转换或转换是有意义的。基于您提供的样本数据,我写了query..just修改根据您的要求 – mohan111