2016-06-11 2 views
1

필자는 열 이름을 연결하고 문자열을 실행하여 동적 피벗 테이블을 만들었습니다. 테이블 결과는 추가 필드를 입력 할 수 있습니다 앞으로이동적 피벗 테이블 삽입

ProductID A  B  C  D 

(E. F ... 요법)을 piviot 쿼리를 동적위한 따라서 필요처럼 보인다. 이 데이터를 A부터 Z까지 열이있는 기존 테이블에 삽입해야합니다.

새 필드가 추가되면 삽입 쿼리를 변경할 필요가 없도록 동적으로 삽입 쿼리를 만들 수 있습니까? 코드에서?

+0

테이블이 정적 인 경우, 실제로 동적 쿼리가 필요하지 않습니다. 최대 Z까지의 열이 포함 된 정적 쿼리 만 있으면 모든 것이 정상적으로 작동합니다. –

답변

1

저장 프로 시저 (아래 나열)는 몇 가지 옵션 만 사용하여 데이터를 피벗합니다. 여러 그룹을 가질 수 있습니다. 다음은 #temp 테이블의 결과를 매개 변수를 기반으로 피벗합니다. 나는주의해야한다. 열은 표현식이 될 수 있습니다.

Select Year=Year(TR_Date),Day=Day(TR_Date),Month=right(concat('00',Month(TR_Date)),2),TR_Y10 Into #Temp from [Chinrus-Series].[dbo].[DS_Treasury_Rates] where TR_Date>='2000-01-01' 

Exec [prc-Pivot] 'Select * from #Temp','Month','sum(TR_Y10)[]','Year,Day' 

반환

Year Day 01  02  03  04  05  06  07  08  09  10  11  12 
2000 1 0.00 6.62 6.39 0.00 6.29 6.20 0.00 6.00 5.68 0.00 5.74 5.52 
2000 2 0.00 6.60 6.40 0.00 6.32 6.15 0.00 5.98 0.00 5.83 5.74 0.00 
2000 3 6.58 6.49 6.39 6.00 6.40 0.00 6.00 5.95 0.00 5.87 5.83 0.00 
2000 4 6.49 6.53 0.00 5.90 6.46 0.00 0.00 5.91 0.00 5.90 0.00 5.53 
2000 5 6.62 0.00 0.00 5.90 6.51 6.12 5.99 0.00 5.69 5.87 0.00 5.43 
2000 6 6.57 0.00 6.42 5.93 0.00 6.14 6.05 0.00 5.72 5.82 5.87 5.32 
2000 7 6.52 6.64 6.39 5.86 0.00 6.13 6.01 5.97 5.76 0.00 5.87 5.32 
2000 8 0.00 6.59 6.38 0.00 6.57 6.13 0.00 5.93 5.73 0.00 5.87 5.35 
2000 9 0.00 6.56 6.35 0.00 6.53 6.13 0.00 5.81 0.00 0.00 5.82 0.00 
2000 10 6.57 6.67 6.39 5.80 6.47 0.00 6.04 5.76 0.00 5.80 5.82 0.00 
2000 11 6.67 6.63 0.00 5.89 6.43 0.00 6.06 5.79 5.77 5.77 0.00 5.37 
2000 12 6.72 0.00 0.00 5.97 6.51 6.09 6.09 0.00 5.78 5.73 0.00 5.36 
2000 13 6.63 0.00 6.36 5.94 0.00 6.11 6.01 0.00 5.74 5.73 5.77 5.29 

... (총 527 행)

내가 추가해야

, 대상 테이블이 고정 된 구조가있는 경우, 수

INSERT YourTableName Exec [prc-Pivot] 'Select * from #Temp','Month','sum(TR_Y10)[-OptionalSuffix]','Year,Day' 

저장 프로 시저 :

,
CREATE PROCEDURE [dbo].[prc-Pivot] (@Select varchar(1000), 
    @PvotCol varchar(100), 
    @Summaries varchar(100), 
    @GroupBy varchar(100), 
    @OtherCols varchar(100) = Null) 
AS 

Set NoCount On 
Set Ansi_Warnings Off 

Declare @Vals varchar(max); 
Set @Vals = '' 
Set @OtherCols= IsNull(', ' + @OtherCols,'') 
Create Table #TempPvot (Pvot varchar(100)) 
Insert Into #TempPvot 
Exec ('Select Distinct Convert(varchar(100),' + @PvotCol + ') as Pvot FROM (' + @Select + ') A') 
Select @Vals = @Vals + ', isnull(' + Replace(Replace(@Summaries,'(','(CASE WHEN ' + @PvotCol + '=''' + Pvot + ''' THEN '),')[', ' END),0) As [' + Pvot) From #TempPvot Order by Pvot 
Drop Table #TempPvot 
Exec ('Select ' + @GroupBy + @OtherCols + @Vals + ' From (' + @Select + ') A Group By ' + @GroupBy + ' Order by ' + @GroupBy) 

Set NoCount Off 
Set Ansi_Warnings on 

일부 확장 옵션 :

Exec [prc-Pivot] 'Select * from #Temp','Month','avg(TR_Y10)[-Month]','Year','min(TR_Y10)[Min],max(TR_Y10)[Max],avg(TR_Y10)[Avg],cast(stdev(TR_Y10) as money)[StdDev]' 


Year Min Max Avg StdDev 01-Month 02-Month 03-Month 04-Month 05-Month 06-Month 07-Month 08-Month 09-Month 10-Month 11-Month 12-Month 
2000 5.02 6.79 6.0302 0.3919 6.661 6.5195 6.2565 5.9905 6.4404 6.0972 6.054 5.826 5.799 5.7385 5.7171 5.2405 
2001 4.22 5.54 5.0206 0.2857 5.1609 5.0989 4.8854 5.141 5.3913 5.2842 5.2361 4.9713 4.7317 4.5668 4.6515 5.0875