结果中的列名称和旋转表格的一部分

时间:2017-07-28 13:06:51

标签: sql sql-server tsql pivot-table information-schema

以下表结构:

'----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'
)

2 个答案:

答案 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