ms sql 枢轴不起作用

ms sql pivot does not work

我正在尝试使用两个字符串变量将简单的 table 从行转置为列。我从网上浏览了几个例子但没有成功。行数会有所不同,因此我需要动态转置 table。下面的代码至少不会产生错误但不会产生结果!

样本table

    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;

如有任何帮助,我们将不胜感激

Sequelspear 曾经说过:"To Pivot or UnPivot, That's the 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;

动态旋转

Declare@Cols 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)

Returns

现在,要逆向旋转,请考虑以下事项:

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','john.smith@email.com'),
(2,0,'Jane','Doe'  ,'jane.doe@email.com')

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

Returns