2012-06-06 4 views
2

동적 피벗 쿼리의 결과를 고정 테이블에 직접 저장하는 방법이 있습니까? 결과는 동적이므로 "create table MyTable as (pivot select statement)"와 같은 컬럼 이름과 메소드를 지정하여 테이블을 생성 할 수 없습니다. SQL Server에서 실패합니다 ("AS '키워드 근처의 구문이 올바르지 않습니다.). SELECT - INTO - FROM 구조를 가져 오기 위해 아래의 SQL을 포맷하려했지만 그렇게하지 못했습니다. 어떤 도움이 분명히 크게 감사하겠습니다!동적 피벗 결과에서 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

안녕 Andriy, 나는 그것을 가지고 있지만 그것을 얻지도 않았다. 그것은이다 FROM SELECT * (선택하여 DateField, REFCODE, SumField을 MyTable에서) p PIVOT ( 합 하여 DateField FOR IN (SumField) ([20110810], [20110815], ..., [20110906], [ 20110907]) ) AS pvl – Daan

+0

그리고 피벗 자체가 잘 돌아가고, 내가 원하는 것을 보여줍니다. 결과를 테이블에 저장하여 다른 피벗 테이블 결과와 추가로 조인/결합 할 수 있습니다. 그리고 어떤 시점에서 자동으로 실행해야하는 작업이기 때문에 먼저 수동으로 테이블을 만든 다음 insert를 사용하고 싶지는 않습니다. – Daan

답변

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) 

난 그냥 다음 스크립트의 새 테이블을 만들고 테스트하고 나에게 사용하기 위해 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 
+0

안녕 Bluefeet. 감사합니다. 나는 왜 내가 몇 시간 동안 고투했는지 이해하지 못한다. 그러나 이것은 내가 의미했던 것과 정확히 같고 결국 간단하다. – Daan

+1

동적 피벗 쿼리를 얻었지만 사용할 수있는 테이블로 덤프하는 효율적인 방법을 찾지 못했습니다. 물론 그것은 이것만큼이나 간단했습니다! Doh !! – jaredbaszler