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

3
有没有办法将动态旋转查询的结果直接存储到固定表中?由于结果是动态的,我不能通过指定列名称和方法来创建表,如“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)

你尝试过在执行之前打印 @sql 吗?构建的脚本是什么样子的? - Andriy M
你好,Andriy, 我已经尝试过了,但是还没有让它正常工作。代码如下: SELECT * FROM (select DateField, RefCode, SumField from MyTable) p PIVOT ( sum(SumField) FOR DateField IN ( [20110810],[20110815], ... ,[20110906],[20110907]) ) AS pvl - Daan
而且枢轴本身运行良好,它展示了我想要的结果。我只是想将结果存储在一个表格中,以便进一步编辑/与其他数据透视表结果连接。 由于这是一个必须在某个时刻自动运行的任务,我不想手动创建表格,然后再使用插入操作。 - Daan
1个回答

2

如果我理解你的意图没有问题,你应该可以在要执行的sql语句中添加INTO mynewTable,这样你就可以得到新表。

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

嗨,Bluefeet。 非常感谢!我不明白为什么我要努力几个小时,但这正是我想表达的,最后还是如此简单。 - Daan
1
我已经想出了一个动态透视查询,但是无法找到将其转储到可用表中的有效方法。当然,这很简单!唉!!! - jaredbaszler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接