2017-07-28 120 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

相應地更新了我的查詢 –