2016-10-14 6 views
1

2つの文字列変数を持つ列から列に単純なテーブルを転置しようとしています。私は成功していないウェブからいくつかの例を探しました。行の数は変わるので、テーブルを動的に転置する必要があります。次のコードは、少なくともエラーを生成しませんが、結果を生成しません!ms sqlピボットが動作しません

サンプル表

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 

アンピボットコード

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; 

すべてのヘルプは

+0

ピボットまたはUNPIVOT? 「行を列にする」はピボットを示しますが、コードにはUnPivotがあります。 –

答えて

1

をいただければ幸いSequelspearはかつて言った: "ピボットまたはUNPIVOTするには、それが問題です。"

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

私は恐ろしい(大変なことに)馬小屋からの応答を始めに読まなかった。それに応じて偽のインターネットポイントが授与されました。 –

0

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

動的ピボットに戻り、今

enter image description here

は、アンピボットに、次の点を考慮してください

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

戻り

enter image description here

関連する問題