在视图中使用SQL Server动态数据透视

时间:2017-08-01 11:13:36

标签: sql-server

我有以下SQL查询以动态方式返回数据:

declare @sql varchar(max)='',@col_list varchar(max)=''
set @col_list =stuff((select  distinct ','+quotename(type) from dm_type for xml path('')),1,1,'')

set @sql = 'select * from
(
select dd.id_project, dd.id_group,dmn.map, dd.year, dt.type,dd.month, dd.value from dm_data dd
left join dm_group_map dgm ON dgm.id_group = dd.id_group 
left join dm_mapping dm ON dm.id_map = dgm.id_map
left join dm_map_names dmn ON dmn.id_map_name = dm.id_map_name
left join dm_type dt ON dt.id_type = dm.id_type
) a
pivot (max(map) for type in ('+@col_list+') ) pv'

我试图将它放在一个过程中,但是我不能将它与Select * from procedure一起使用,我想在视图中返回该查询中的数据,只是为了能够使用它。 创建表无济于事,因为列数可能不同(dm_type表中可能有2,3行或更多行)

下面,SQLFiddle: http://sqlfiddle.com/#!6/afb83b/16/0

有没有人知道如何创建可以像Select * from pivot一样使用的东西?

1 个答案:

答案 0 :(得分:1)

[1] @col_list@sql应该有NVARCHAR数据类型

[2]我会在原始剧本中添加以下声明:

EXEC sp_executesql @sql

[3]最终剧本应为

declare @sql nvarchar(max)='',@col_list nvarchar(max)=''
set @col_list =stuff((select  distinct ','+quotename(type) from dm_type for xml path('')),1,1,'')

set @sql = 'select * from
(
select dd.id_project, dd.id_group,dmn.map, dd.year, dt.type,dd.month, dd.value from dm_data dd
left join dm_group_map dgm ON dgm.id_group = dd.id_group 
left join dm_mapping dm ON dm.id_map = dgm.id_map
left join dm_map_names dmn ON dmn.id_map_name = dm.id_map_name
left join dm_type dt ON dt.id_type = dm.id_type
) a
pivot (max(map) for type in ('+@col_list+') ) pv'

EXEC sp_executesql @sql

[4]上次SELECT语句只是SELECT ... FROM ... pv,其中pvPIVOT结果的别名。

[5]如果您想要一个更简单的解决方案来转移数据,那么我会使用Reporting Services:SSRS Pivoting a column