저장 프로 시저 (아래 나열)는 몇 가지 옵션 만 사용하여 데이터를 피벗합니다. 여러 그룹을 가질 수 있습니다. 다음은 #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
테이블이 정적 인 경우, 실제로 동적 쿼리가 필요하지 않습니다. 최대 Z까지의 열이 포함 된 정적 쿼리 만 있으면 모든 것이 정상적으로 작동합니다. –