从动态数据透视结果在SQL Server上创建表

时间:2012-06-06 10:44:00

标签: sql-server pivot create-table

有没有办法将动态数据透视查询的结果直接存储到固定表中?由于结果是动态的,我不能通过指定列名来创建表,并且“创建表MyTable as(pivot select statement)”似乎在SQL服务器上失败(“关键字'AS'附近的语法不正确”)。 我试图格式化下面的SQL以获得SELECT - INTO - FROM结构,但未能这样做。任何帮助显然非常感谢!

用于数据透视的SQL是(建立感谢这个伟大的网站!):

declare @pivot varchar(max), @sql varchar(max)
create table pivot_columns (pivot_column varchar(100))

insert into pivot_columns
select distinct DateField from MyTable order by 1

select @pivot=coalesce(@pivot+',','')+'['+pivot_column+']'from pivot_columns

set @sql = 'SELECT * FROM (select DateField, RefCode, SumField from MyTable) p
PIVOT
(sum(SumField) FOR DateField IN  ( ' + @pivot + ') ) 
AS pvl'

drop table pivot_columns

exec (@sql)

1 个答案:

答案 0 :(得分:2)

除非我没有按照您的意图进行操作,否则您应该能够将INTO mynewTable添加到您要执行的sql中,并且应该获得新表。

declare @pivot varchar(max), @sql varchar(max)
create table pivot_columns (pivot_column varchar(100))

insert into pivot_columns
select distinct DateField from MyTable order by 1

select @pivot=coalesce(@pivot+',','')+'['+pivot_column+']'from pivot_columns

set @sql = 'SELECT * INTO mynewTable FROM (select DateField, RefCode, SumField from MyTable) p
PIVOT
(sum(SumField) FOR DateField IN  ( ' + @pivot + ') ) 
AS pvl'

drop table pivot_columns

exec (@sql)

我只是测试在以下脚本中创建一个新表,它为我提供了一个在DB中使用的新表:

create table t
( 
    [month] int, 
    [id] nvarchar(20), 
    [cnt] int 
)

insert t values (4,'TOTAL',214)
insert t values (5,'TOTAL',23)
insert t values (6,'TOTAL',23)
insert t values (4,'FUNC',47)
insert t values (5,'FUNC',5)
insert t values (6,'FUNC',5)
insert t values (4,'INDIL',167)
insert t values (5,'INDIL',18)
insert t values (6,'INDIL',18)


DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX);

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(month) 
            FROM t 
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT *
            INTO tabletest from 
            (
                select month, id, cnt
                from t
           ) x
            pivot 
            (
                 sum(cnt)
                for month in (' + @cols + ')
            ) p '


execute(@query)

drop table t