2017-07-28 3 views
1

Voici une structure de table:noms de colonnes dans le résultat et faites pivoter une partie de la table

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

besoin d'obtenir le résultat suivant:

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

Comment écrire cette requête? Je peux obtenir des noms de colonnes de INFORMATION_SCHEMA.COLUMNS. Mais comment joindre la table avec INFORMATION_SCHEMA.COLUMNS? Aussi comment faire pivoter une partie de la table?

Comme exemple vivant. Voici le tableau:

enter image description here

Sur capture d'écran seulement, mais plusieurs champs dans la table il y a beaucoup de champs. J'ai écrit la requête suivante:

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

Mais cette requête ne renvoie pas de valeurs NULL.

Aussi je veux obtenir des colonnes de INFORMATION_SCHEMA.COLUMNS et passé les dans ([area], [davlplastmax]).

Par exemple:

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

Vous pouvez utiliser des instructions CASE ou UNPIVOT. –

+0

UNPIVOT semble être la voie à suivre car certains ont déjà répondu. Question: pourquoi essayez-vous de rejoindre 'INFORMATION_SCHEMA.COLUMNS'? – Eli

Répondre

2

Unpivot?

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

Merci pour votre réponse. J'ai complété la question. Regardez la paix. – Seva

2

Vous pouvez utiliser UNPIVOT comme ci-dessous:

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

sortie comme ci-dessous:

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

Vous pouvez utiliser la requête dynamique comme ci-dessous pour obtenir des colonnes de 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

Merci pour votre réponse. J'ai complété la question. Regardez la paix. – Seva

+0

Mis à jour ma requête en conséquence –