代码之家  ›  专栏  ›  技术社区  ›  Avi

如何在不指定表的列名的情况下将dymanic pivot的结果存储到临时表中?

  •  1
  • Avi  · 技术社区  · 6 年前

    我试图为表做动态列透视。 我能做到这一点,多亏了这里提供的解释。 ( 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
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Avi    6 年前

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

     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