2012-06-06 167 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