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 不起作用?