我试图对表进行动态列透视。 多亏了这里提供的说明,我才能够做到这一点 (SQL Server dynamic PIVOT query?)
create table pivottest (Columnname varchar(100), value varchar(100)) ;
insert into pivottest values ('Age', '25'),
('Email', 'Rob@gmail.com'),
('Phone', '888888888'),
('Name', 'Rob'),
('Age', '20'),
('Email', 'Bob@gmail.com'),
('Phone', '999999999'),
('Name', 'Bob'),
('Age', '20'),
('Name', 'Ben'),
(null, null)
我是否根据链接中提供的答案进行相同的操作?
select *, ROW_NUMBER() over (partition by columnname order by value) Rownum
into #temp from pivottest
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX);
SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.Columnname)
FROM #temp c
FOR XML PATH(''))
,1,1,'')
set @query = 'SELECT '+@cols+' from
(
select Columnname, Rownum
, value
from #temp
) x
pivot
(
max(Value)
for Columnname in (' + @cols + ')
) p '
Execute @query
我得到了所需的数据透视部分的结果,现在我想将数据存储到一些临时表中,并在同一会话中引用它,因为它给我错误提示说对象不存在。
我可以通过这种方式在某些物理表中选择*。我可以每次参考物理表。但是我想在#temp表
中做set @query = 'SELECT '+@cols+' into dynamicpivotdata from
(
select Columnname, Rownum
, value
from #temp
) x
pivot
(
max(Value)
for Columnname in (' + @cols + ')
) p '
execute(@query)
select * from dynamicpivotdata
此外,我可以从Temp表中获取结果,但是我必须首先创建具有所需所有列的表,然后才能以这种方式引用它。但是我想像对物理表那样选择Select *到临时表中,而不指定列名。有什么方法可以将数据存储在临时表中?
create table #temp5 (Age int ,
Email varchar(100),
Name varchar(100),
Phone varchar(15))
set @query = 'SELECT '+@cols+' from
(
select Columnname, Rownum
, value
from #temp
) x
pivot
(
max(Value)
for Columnname in (' + @cols + ')
) p '
insert into #temp5 execute(@query)
select * from #temp5
我从#temp5和dynamicpivotdata获得的最终输出看起来像这样。如果可能的话,如果我从select *到#temp table选项中获得相同的输出,这将很有帮助。
Age Email Name Phone
20 Bob@gmail.com Ben 888888888
20 Rob@gmail.com Bob 999999999
25 NULL Rob NULL
答案 0 :(得分:0)
似乎我可以通过这种方式使用全局临时表来获得所需的结果。
set @query = 'SELECT '+@cols+' into ##temp1 from
(
select Columnname, Rownum
, value
from #temp
) x
pivot
(
max(Value)
for Columnname in (' + @cols + ')
) p '
execute(@query)
select * from ##temp1
Age Email Name Phone
20 Bob@gmail.com Ben 888888888
20 Rob@gmail.com Bob 999999999
25 NULL Rob NULL