写一个符合自己要求使用透视存储过程。在开发时,直接使用即可。
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: Insus.NET -- Create date: 2019-05-19 -- Update date: 2019-05-19 -- Description: 动态透视 CREATE PROCEDURE [dbo].[usp_Dynamic_Pivot] ( @table_name SYSNAME, --透视的表名 @common_column SYSNAME, --常规共用列名 @which_row_to_column SYSNAME, --哪一行需要透视为列的列名 @sum_column SYSNAME --计和的列名 ) AS BEGIN DECLARE @Comma_Delimited_Column_Names NVARCHAR(MAX) DECLARE @query NVARCHAR(MAX) = N'SET @Comma_Delimited_Column_Names = STUFF((SELECT DISTINCT '','' + QUOTENAME('+ @which_row_to_column +') FROM '+ @table_name +' FOR XML PATH(''''), TYPE ).value(''.'', ''NVARCHAR(MAX)'') ,1,1,'''')' EXECUTE sp_executeSql @query, N'@Comma_Delimited_Column_Names AS NVARCHAR(MAX) OUTPUT',@Comma_Delimited_Column_Names OUTPUT DECLARE @sql AS NVARCHAR(MAX) = N' SELECT '+ @common_column +', ' + @Comma_Delimited_Column_Names + ' FROM ( SELECT '+ @common_column +','+ @which_row_to_column +','+ @sum_column +' FROM '+ @table_name +' ) AS [Source] PIVOT ( SUM('+ @sum_column +') FOR '+ @which_row_to_column +' IN (' + @Comma_Delimited_Column_Names + ') ) AS [PIVOT TABLE] ' EXECUTE sp_executeSql @sql END GO