2016-10-14 1 views
1

J'essaie de transposer une table simple de lignes en colonnes avec deux variables de chaîne. Je suis allé à travers plusieurs exemples du web sans succès. Le nombre de lignes variera donc j'ai besoin de transposer la table dynamiquement. Le code suivant au moins ne génère pas d'erreur mais ne génère pas le résultat!ms pivot SQL ne fonctionne pas

Le tableau exemple

create table #Encabezado 
    (
    NodeName nvarchar(100), 
    NodeValue nvarchar(100) 
    ) 

INSERT INTO #Encabezado (NodeName, NodeValue) VALUES 
('RUTEmisor','88888888-8'), 
('RznSoc','EMPRESA DE PRUEBA'), 
('GiroEmis','Informatica'), 
('Acteco','1'), 
('CdgSIISucur','59529595'), 
('DirOrigen','Teatinos 120'), 
('CmnaOrigen','Santiago'), 
('CiudadOrigen','Santiago') 
GO 

Le code UNPIVOT

DECLARE @colsUnpivot AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @colsUnpivot 
    = stuff((select ','+quotename(C.column_name) 
      from information_schema.columns as C 
      where C.table_name = '#Encabezado' and 
       C.column_name like '%Name' 
      for xml path('')), 1, 1, '') 

set @query 
    = 'select NodeName, 
     Nodevalue 
    from #Encabezado 
    unpivot 
    (
     NodeName 
     for NodeName in ('+ @colsunpivot +') 
    ) u' 

exec sp_executesql @query; 

Toute aide serait appréciée

+0

Pivot ou UNPIVOT? "Rows to columns" indique Pivot, mais vous avez UnPivot dans votre code. –

Répondre

1

Sequelspear a dit: "Pour pivoter ou UNPIVOT, c'est la question."

declare @cols NVARCHAR(MAX) = stuff((select ','+quotename(Nodename) from #Encabezado group by Nodename for xml path('')),1,1,''); 

declare @query NVARCHAR(MAX) = 'select * from #Encabezado pivot (max(NodeValue) for NodeName IN ('+ @cols +')) pvt'; 

exec sp_executesql @query; 
+0

Je n'ai pas lu la réponse de l'horrible (très impressionnant) calembour au début. Faux points Internet attribués en conséquence. –

0

Pour Dynamiquement Pivot

[email protected] AS NVARCHAR(MAX),@SQL AS NVARCHAR(MAX); 

Set @Cols = Stuff((Select Distinct ',' + QuoteName(NodeName) 
        From #Encabezado 
        For XML Path(''), Type 
        ).value('.', 'varchar(max)'),1,1,'') 

Set @SQL = 'Select * From #Encabezado 
      Pivot (
        max(NodeValue) 
        For [NodeName] in (' + @Cols + ') 
       ) p ' 

Exec (@SQL) 

Retours

enter image description here

Maintenant, pour UNPIVOT, considérer les points suivants:

Declare @User table (ID int,Active bit,First_Name varchar(50),Last_Name varchar(50),EMail varchar(50)) 
Insert into @User values 
(1,1,'John','Smith','[email protected]'), 
(2,0,'Jane','Doe' ,'[email protected]') 

Declare @XML xml = (Select * from @User for XML RAW) 

Select ID  = r.value('@ID','int') 
     ,Active = r.value('@Active','bit') 
     ,Item = attr.value('local-name(.)','varchar(100)') 
     ,Value = attr.value('.','varchar(max)') 
From @XML.nodes('/row') as A(r) 
Cross Apply A.r.nodes('./@*') AS B(attr) 
Where attr.value('local-name(.)','varchar(100)') not in ('ID','Active') 

Retours

enter image description here