2013-04-03 30 views
0

一个有一个表 “研究” 与列 “ID”, “代码1”, “代码2”, “SOC0”, “SOC1” ... “SOCN” ,其中n = 40。如何正确书写UNPIVOT?

细胞的值不是此刻的重要,因为我需要得到像“SOC”列的列表:

soc0 
soc1 
.... 
soc40 

能否请你帮我写了unpivot查询?

+0

此问题未显示任何研究工作。 **做你的作业很重要**。告诉我们你发现了什么,***为什么它不符合你的需求。这表明你已经花时间去尝试帮助你自己了,它使我们避免重申明显的答案,最重要的是它可以帮助你得到更具体和相关的答案。 [FAQ](http://stackoverflow.com/questions/how-to-ask)。 – Kermit

+1

如果你只想列的名字,那么你为什么要使用'UNPIVOT'表操作符呢?为什么不直接从'information_schema.columns'读取这些列的名字? –

+0

to FreshPrince - 我做了作业,所有主题都描述了如何转换表格的值。但是,因为我伤心,我只需要专栏来说明我的进一步行动。马哈茂德的 - 我必须得到相同的结果。其中之一是与information_schema.columns和我做到了。另一个任务是使用unpivot函数得到结果。这就是我寻求帮助的原因。 – Almazini

回答

3

可以使用UNPIVOT函数来获取此。

的基本语法是:

select * 
from research 
unpivot 
(
    value 
    for col in (soc0, soc1, soc40) 
) un; 

SQL Fiddle with Demo

但你必须输入了所有要unpivot的列名。如果你不想类型的所有列名,那么你可以使用动态SQL:

DECLARE @colsUnpivot AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @colsUnpivot = stuff((select ','+quotename(C.column_name) 
     from information_schema.columns as C 
     where C.table_name = 'research' and 
       C.column_name like 'soc%' 
     for xml path('')), 1, 1, '') 

set @query 
    = 'select id, col, value 
    from research 
    unpivot 
    (
     value 
     for col in ('+ @colsunpivot +') 
    ) u' 

exec(@query) 

SQL Fiddle with Demo

但如果你只是想列名的列表,然后你就可以查询这直接不逆透视:

select C.table_name, C.column_name 
from information_schema.columns c 
where C.table_name = 'research' and 
    C.column_name like 'soc%' 

SQL Fiddle with Demo

1

试试这个

select unpvt.value 
from research c 
unpivot ( 
value 
for attribute in (Colsoc0,Colsoc1,Colsoc2,..,Colsocn) 
) unpvt