1. 程式人生 > 實用技巧 >SQL通用行轉列,動態列

SQL通用行轉列,動態列

本人能力有限,請大家複製後自行優化。

使用方法:

        select row_number() over(order by convert(date,inDate,105)) rowid,convert(date,inDate,105) 日期,
        sum(case when flag='二級報警' then 1 else 0 end ) 二級報警, 
        sum(case when flag='三級報警' then 1 else 0 end ) 三級報警 into ##tt --插入到全域性臨時表
        from pinAdd where inDate>=
'2020-11-30' group by convert(date,inDate,105) select * from ##tt exec DynamicColumn @table='##tt', --臨時表名 @firstName='日期', --指定按哪一列來轉換 @orderName='rowid' --指定排序列 drop table ##tt --用完請將全域性臨時表刪除

內部實現:

ALTER PROCEDURE
[dbo].[DynamicColumn] @table varchar(50), --臨時表名 @firstName varchar(50), --按哪一列(列名)來轉換 @orderName varchar(50) --按哪一列來排序 AS begin declare @sql nvarchar(max),@sql2 nvarchar(max),@subStr varchar(500),@id int,@count int,@col varchar(50) set @sql='create table ##Dtb('+quotename(@firstName)+' varchar(50),
' set @id=1 set @subStr='' exec('select row_number()over(order by convert(varchar(50),'+@orderName+')) id,'+@firstName+' as '+@firstName+' into ##tb from tempdb..'+@table) select @count=count(1) from ##tb while(@id<=@count) begin set @sql2='select @col='+@firstName+' from ##tb where id=@id' exec sp_executesql @sql2,N'@col varchar(50) out,@id int',@col out,@id set @subStr=@subStr+quotename(@col)+' varchar(50),' set @id=@id+1 end exec(@sql+@subStr+')') set @id=1 select row_number()over(order by colid) id,name into #ins from tempdb.dbo.syscolumns where id=object_id( 'tempdb..'+@table) and name!=@firstName order by colid select @count=count(1) from #ins while(@id<=@count) begin select @col=name from #ins where id=@id set @sql ='insert into ##Dtb select '+quotename(@col,'''')+', ' --select * from #ins for xml path('') --set @sql2='select @col=( -- select '+''''''''''+'+convert(varchar(10),['+@col+'])+'+quotename(''',','''')+' from '+@table+' order by '+@orderName+' for xml path('''') --)' set @sql2=concat('select @col=(select ''''''''+convert(varchar(10),[',@col,'])+' , ''''''','' from ',@table,' order by rowid for xml path(''''))') exec sp_executesql @sql2,N'@col varchar(max) out',@col out
set @sql=@sql+substring(@col, 1, len(@col)-1) exec(@sql) set @id=@id+1 end set @sql=N'select * from ##Dtb where '+quotename(@firstName)+'!=@orderName' exec sp_executesql @sql,N'@orderName varchar(50)',@orderName --set @sql='drop table '+@table --exec(@sql) drop table ##Dtb drop table ##tb end