【发布时间】:2019-01-02 05:37:29
【问题描述】:
我正在尝试为表格进行动态列透视。 感谢此处提供的解释,我能够做到这一点 (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 table 中做
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 * into for temp table 一样,就像我对物理表所做的那样,而不指定列名。有没有办法将数据存储在临时表中?
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 * into #temp table 选项中获得相同的输出,那将会很有帮助。
Age Email Name Phone
20 Bob@gmail.com Ben 888888888
20 Rob@gmail.com Bob 999999999
25 NULL Rob NULL
【问题讨论】:
-
最终输出的样子。请代表它。
-
@SurajKumar 请检查我添加的最终输出。
-
请查看更新答案。
标签: sql-server tsql dynamic-sql