首页 > 解决方案 > 如何在不为表指定列名的情况下将动态数据透视的结果存储到临时表中?

问题描述

我试图为表格做动态列透视。感谢这里提供的解释,我能够做到这一点(SQL Server 动态 PIVOT 查询?

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 * 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

标签: sql-servertsqldynamic-sql

解决方案


看来我可以通过这种方式利用全局临时表来获得我想要的结果。

 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  

推荐阅读