以下表结构:
'----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
联系表?如何旋转表的一部分?
作为活生生的榜样。以下是表格:
在屏幕截图上只有几个字段,但在表格中有很多字段。我写了以下查询:
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 :(得分:2)
逆透视?
select u.id, u.name, u.fields, u.values
from MyTable t
unpivot
(
values
for fields in (Field1, Field2)
) u;
答案 1 :(得分: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