我试图对一个表做动态列支点。我能做到这一点,得益于这里提供的解释(SQL Server dynamic PIVOT query?)
create table pivottest (Columnname varchar(100), value varchar(100)) ;
insert into pivottest values ('Age', '25'),
('Email', '[email protected]'),
('Phone', '888888888'),
('Name', 'Rob'),
('Age', '20'),
('Email', '[email protected]'),
('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
另外,我可以从临时表中的结果,但我必须与所有所需的列先创建表,然后我可以把它用这种方式。但我想做像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得到看起来像这样。如果我从选择*输出同样为可能的话#TEMP表选项,将是有益的。
Age Email Name Phone
20 [email protected] Ben 888888888
20 [email protected] Bob 999999999
25 NULL Rob NULL
好像我可以利用全局临时表以这种方式让我想要的结果。
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 [email protected] Ben 888888888
20 [email protected] Bob 999999999
25 NULL Rob NULL