如何在不为 table 指定列名的情况下将动态数据透视表的结果存储到临时 table 中?
How to store the result of Dymanic pivot into a temp table without specifying column names for a table?
我正在尝试为 table 执行动态列透视。
由于此处提供的解释,我能够做到这一点
(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)
我正在根据 link 中提供的答案采用相同的方式?
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
我得到了数据透视部分想要的结果,现在我想将数据存储到某个临时文件中 table 并在同一会话中引用它,因为它给我错误提示对象不存在。
我可以通过这种方式将 select * 转化为一些物理 table。我每次都可以参考物理table。但我想在#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 table 获得结果,但我必须先创建 table 并包含所有必需的列,然后我才能以这种方式引用它。但是我想像 Select * 一样为 temp table 做,就像我为 physical table 做的一样,而不指定列名。有什么方法可以将数据存储在 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 * 到 #temp table 选项中获得相同的输出,那将会很有帮助。
Age Email Name Phone
20 Bob@gmail.com Ben 888888888
20 Rob@gmail.com Bob 999999999
25 NULL Rob NULL
看来我可以通过这种方式利用全局临时 table 来获得我想要的结果。
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
我正在尝试为 table 执行动态列透视。 由于此处提供的解释,我能够做到这一点 (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)
我正在根据 link 中提供的答案采用相同的方式?
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
我得到了数据透视部分想要的结果,现在我想将数据存储到某个临时文件中 table 并在同一会话中引用它,因为它给我错误提示对象不存在。
我可以通过这种方式将 select * 转化为一些物理 table。我每次都可以参考物理table。但我想在#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 table 获得结果,但我必须先创建 table 并包含所有必需的列,然后我才能以这种方式引用它。但是我想像 Select * 一样为 temp table 做,就像我为 physical table 做的一样,而不指定列名。有什么方法可以将数据存储在 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 * 到 #temp table 选项中获得相同的输出,那将会很有帮助。
Age Email Name Phone
20 Bob@gmail.com Ben 888888888
20 Rob@gmail.com Bob 999999999
25 NULL Rob NULL
看来我可以通过这种方式利用全局临时 table 来获得我想要的结果。
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