2017-07-28 64 views
1

的部分,下面的表结构:列名和旋转表

'----ID-----'----NAME----'----FIELD1----'----FIELD2----' 
'  1  ' val  '  123  '  321 ' 
'  2  ' val2 '  234  '  212 ' 

需要得到以下结果:

'----ID-----'----NAME----'----FIELDS----'----VALUES----' 
'  1  ' val  ' FIELD1 '  123  ' 
'  1  ' val  ' FIELD2 '  321  ' 
'  2  ' val2 ' FIELD1 '  234  ' 
'  2  ' val2 ' FIELD2 '  212  ' 

如何写这个查询?我可以从INFORMATION_SCHEMA.COLUMNS获取列名。但如何与INFORMATION_SCHEMA.COLUMNS连接表?另外如何旋转一部分表格?

作为生活的例子。以下是表:

enter image description here

在截图只是几个字段,但表有很多领域。我写了下面的查询:

Select p.GUID, p.myvalues, p.Fields 
from myTable gz 
unpivot([myvalues] for Fields in ([area], [davlplastmax])) p 

但是这个查询不返回空值。

此外,我想从INFORMATION_SCHEMA.COLUMNS获得专栏,并通过([area], [davlplastmax])过去。

例如:

unpivot([values] for Fields in (
    SELECT [MyDb].INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME 
    FROM [MyDb].INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME = N'MyTable' 
) 
+0

越来越列您可以使用CASE或UNPIVOT语句。 –

+0

因为一些人已经回答,UNPIVOT似乎是要走的路。问题:为什么你想加入到'INFORMATION_SCHEMA.COLUMNS'? – Eli

回答

2

逆透视?

select u.id, u.name, u.fields, u.values 
from MyTable t 
unpivot 
(
    values 
    for fields in (Field1, Field2) 
) u; 
+0

感谢您的回答。我补充了这个问题。 – Seva

2

您可以按以下使用逆透视:

Select * from #data 
unpivot([values] for Fields in ([Field1],[Field2])) p 

输出如下:

+----+------+--------+--------+ 
| Id | Name | values | Fields | 
+----+------+--------+--------+ 
| 1 | val | 123 | Field1 | 
| 1 | val | 321 | Field2 | 
| 2 | val2 | 234 | Field1 | 
| 2 | val2 | 212 | Field2 | 
+----+------+--------+--------+ 

您可以按以下使用动态查询从Information_Schemas

Declare @cols1 varchar(max) 
Declare @query nvarchar(max) 

Select @cols1 = stuff((select ','+QuoteName(Column_Name) from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'TestData' 
     and COLUMN_NAME not in ('Id','Name') for xml path('')),1,1,'') 

Select @query = ' Select * from 
    (Select * from #data)a 
    unpivot([values] for Fields in (' + @cols1+ ')) p ' 

Exec sp_executeSql @query 
+0

感谢您的回答。我补充了这个问题。 – Seva

+0

相应地更新了我的查询 –