2012-06-06 131 views
2

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

用于枢轴的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) 
+0

您是否尝试过印刷'@ sql'而不是/在执行之前?构建的脚本是什么样的? –

+0

嗨安德里, 我有,但也没有得到它的工作。它是: SELECT * FROM(选择的DateField,RefCode,SumField从MyTable的)p PIVOT ( 总和(SumField) FOR的DateField IN ([20110810],[20110815],...,[20110906],[ 20110907])) )作为镜头 – Daan

+0

而枢轴本身运行良好,它显示了我想要什么。我只想将结果存储在表中,以便进一步编辑/连接其他数据透视表结果。 因为这是一个必须在某个时候自动运行的任务,所以我不想先手动创建表,然后使用insert。 – Daan

回答

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) 

我只是测试在下面的脚本创建一个新表,它给了我一个新的表,它是在数据库中使用:

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 
+0

嗨Bluefeet。 非常感谢!我不明白为什么我会奋斗几个小时,但这正是我的意思,最终如此简单。 – Daan

+1

得到了一个动态数据透视查询了解自己,但无法找出将其转储到可用表中的有效方法。当然这很简单!卫生署!!!! – jaredbaszler