3

動的ピボットクエリの結果を固定テーブルに直接保存する方法はありますか?結果は動的であるため、列名を指定してテーブルを作成できません。「create table MyTable as(pivot selectstatement)」のようなメソッドはSQLサーバーで失敗するようです(「キーワード「AS」の近くの構文が正しくありません」)。SELECT --INTO --FROM構造を取得するために、以下のSQLをフォーマットしようとしましたが、失敗しました。どんな助けでも明らかに大歓迎です!

ピボットに使用されるSQLは次のとおりです(このすばらしいWebサイトのおかげで構築できます!):

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)
4

1 に答える 1

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
于 2012-06-06T14:35:47.650 に答える