我试图为表做动态列透视。
我能做到这一点,多亏了这里提供的解释。
(
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
我得到了我想要的数据透视部分的结果,现在我想将数据存储到某个临时表中,并在同一个会话中引用它,因为它给了我一个错误,即对象不存在。
我可以这样在一些物理表中选择*。我每次都可以参考物理表。但我想在临时桌上做
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
另外,我可以从临时表中获得结果,但是我必须先创建包含所有所需列的表,然后用这种方式引用它。但是,我想在临时表中使用select*into,就像在物理表中使用select*into一样,而不需要指定列名。有没有办法把数据存储在临时表中?
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表选项中获得相同的输出将很有帮助。
Age Email Name Phone
20 Bob@gmail.com Ben 888888888
20 Rob@gmail.com Bob 999999999
25 NULL Rob NULL