ms sql pivot 不起作用

Posted

技术标签:

【中文标题】ms sql pivot 不起作用【英文标题】:ms sql pivot does not work 【发布时间】:2016-10-14 22:17:50 【问题描述】:

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

样本表

    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;

任何帮助将不胜感激

【问题讨论】:

Pivot 还是 UnPivot? “行到列”表示 Pivot,但您的代码中有 UnPivot。 【参考方案1】:

Sequelspear 曾经说过:“转轴还是转轴,这是个问题。”

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;

【讨论】:

一开始我没有读到可怕(-ly awesome)双关语的反应。相应奖励的虚假互联网积分。【参考方案2】:

动态旋转

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)

退货

现在,要取消透视,请考虑以下事项:

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

返回

【讨论】:

以上是关于ms sql pivot 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

SQL / MS Access - 为啥这个 CASE 不起作用?

SQL Null 语句不起作用 MS Access

Ms Access SQL 更新语句不起作用

MS SQL Server 2012:网络访问配置不起作用

Pentaho 数据集成:与 MS SQL Server 的 jdbc 连接不起作用

关联(pivot,belongsToMany)中的续集挂钩(afterCreate.afterUpdate)不起作用