我有以下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
一样使用的东西?
答案 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
,其中pv
是PIVOT
结果的别名。
[5]如果您想要一个更简单的解决方案来转移数据,那么我会使用Reporting Services:SSRS Pivoting a column