一般在做数据统计的时候会用到行转列,假如要统计学生的成绩,数据库里查询出来的会是这样的,但这并不能达到想要的效果,所以要在查询的时候做一下处理,下面话不多说了,来一起看看详细的介绍。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | CREATE TABLE TestTable( [Id] [ int ] IDENTITY(1,1) NOT NULL , [UserName] [nvarchar](50) NULL , [Subject] [nvarchar](50) NULL , [Source] [ numeric ](18, 0) NULL ) ON [ PRIMARY ] go INSERT INTO TestTable ([UserName],[Subject],[Source]) SELECT N '张三' ,N '语文' ,60 UNION ALL SELECT N '李四' ,N '数学' ,70 UNION ALL SELECT N '王五' ,N '英语' ,80 UNION ALL SELECT N '王五' ,N '数学' ,75 UNION ALL SELECT N '王五' ,N '语文' ,57 UNION ALL SELECT N '李四' ,N '语文' ,80 UNION ALL SELECT N '张三' ,N '英语' ,100 GO |
这里我用了三种方法来实现行转列
第一种:静态行转列 group by 和sum或max
1 2 3 | select UserName 姓名, sum ( case Subject when '语文' then Source else 0 end ) 语文, sum ( case Subject when '数学' then Source else 0 end ) 数学, sum ( case Subject when '英语' then Source else 0 end ) 英语 from TestTable group by UserName |
用povit行转列
1 2 3 | select * from ( select UserName,Subject,Source from TestTable) testpivot( sum (Source) for Subject in (语文,数学,英语) ) pvt |
用存储过程行转列
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | alter proc pro_test @userImages varchar (200), @Subject varchar (20), @Subject1 varchar (200), @TableName varchar (50) as declare @sql varchar ( max )= 'select * from (select ' +@userImages+ ' from' +@TableName+ ') tab pivot ( sum(' +@Subject+ ') for Subject(' +@Subject1+ ') ) pvt' exec (@sql) go exec pro_test 'UserName,Subject,Source' , 'TestTable' , 'Subject' , '语文,数学,英语' |
它们的效果都是这样的
以上三种方式实现行转列,我们可以根据自己的需求采用不同的方法