2012-05-30 74 views
1

我正在SSMS 2008 R2中开发T-SQL查询,它只返回一行。但问题是,在这一行中有四个字段,我反而希望它们是唯一的行。例如,我的输出线的样子:如何将单行SQL结果转换为多行?

Col. 1 Col. 2 Col. 3 Col. 4 
xxxx  yyyy  zzzz  aaaa 

相反,我想这个样子:

Question Answer 
Col. 1  xxxx 
Col. 2  yyyy 
Col. 3  zzzz 
Col. 4  aaaa 

我已经使用这个UNPIVOT运营商尝试过,但它不是做上述。我怎样才能做到这一点?

+0

你是什么意思它是不做以上?这正是UNPIVOT的目标。你究竟做了什么,究竟是如何不起作用的?也许只是阅读这里的例子http://msdn.microsoft.com/en-us/library/ms177410(v=sql.105).aspx –

回答

7

您应该能够使用UNPIVOT此:

这是一个静态的支点,你硬编码在列的值:

create table t1 
(
    col1 varchar(5), 
    col2 varchar(5), 
    col3 varchar(5), 
    col4 varchar(5) 
) 

insert into t1 values ('xxxx', 'yyyy', 'zzzz', 'aaaa') 

select question, answer 
FROM t1 
unpivot 
(
    answer 
    for question in (col1, col2, col3, col4) 
) u 

drop table t1 

这里是一个SQL Fiddle与演示。

,但你也可以使用动态逆透视:

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX); 

select @cols = stuff((select ','+quotename(C.name) 
     from sys.columns as C 
     where C.object_id = object_id('t1') and 
       C.name like 'Col%' 
     for xml path('')), 1, 1, '') 

set @query = 'SELECT question, answer 
      from t1 
      unpivot 
      (
       answer 
       for question in (' + @cols + ') 
      ) p ' 

execute(@query) 
+0

我喜欢它!这正是*我正在寻找的东西!谢谢!我太激动了! – salvationishere

0

这是从我的数据名称,但它是测试

select 'sID', sID as 'val' from [CSdemo01].[dbo].[docSVsys] where sID = 247 union select 'sParID', sParID as 'val' from [CSdemo01].[dbo].[docSVsys] where sID = 247 ; 

但是UNPIVOT应该工作