Sql server 动态数据透视表插入
我通过连接列名并对字符串执行一个命令创建了一个动态透视表。表格结果如下所示Sql server 动态数据透视表插入,sql-server,insert,pivot-table,Sql Server,Insert,Pivot Table,我通过连接列名并对字符串执行一个命令创建了一个动态透视表。表格结果如下所示 ProductID A B C D 将来可能会输入一个额外的字段(E.F…Ect),因此piviot查询需要是动态的。我需要将这些数据插入到一个现有的表中,该表包含A到Z列 如何创建动态的插入查询,以便在添加新字段时,插入查询不需要在代码中更改?存储过程(如下所列)只需几个选项即可透视数据。您可以有多个分组依据。下面将根据参数从#temp表和pivot中获取结果。我应该注意到。
ProductID A B C D
将来可能会输入一个额外的字段(E.F…Ect),因此piviot查询需要是动态的。我需要将这些数据插入到一个现有的表中,该表包含A到Z列
如何创建动态的插入查询,以便在添加新字段时,插入查询不需要在代码中更改?存储过程(如下所列)只需几个选项即可透视数据。您可以有多个分组依据。下面将根据参数从#temp表和pivot中获取结果。我应该注意到。列可以是表达式
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的静态查询,一切都应该正常