--建立行轉列表及插入數據 create table tb_RowConvertToColumn ( username nvarchar(100) null, course nvarchar(100) null, score numeric(10,2) null ) insert into tb_RowConvertToColumn(username,course,score) values('張三','語文',82) insert into tb_RowConvertToColumn(username,course,score) values('張三','數學',85) insert into tb_RowConvertToColumn(username,course,score) values('張三','外語',90) insert into tb_RowConvertToColumn(username,course,score) values('李四','語文',86) insert into tb_RowConvertToColumn(username,course,score) values('李四','數學',82) insert into tb_RowConvertToColumn(username,course,score) values('李四','外語',92) insert into tb_RowConvertToColumn(username,course,score) values('王五','語文',82) insert into tb_RowConvertToColumn(username,course,score) values('王五','數學',94) insert into tb_RowConvertToColumn(username,course,score) values('王五','外語',82) --1.靜態sql行轉列,該sql指定了轉換的列頭 select username 姓名, MAX(case course when '語文' then score else 0 end) 語文, MAX(case course when '數學' then score else 0 end) 數學, MAX(case course when '外語' then score else 0 end) 外語 from tb_RowConvertToColumn group by username order by username /* 姓名 語文 數學 外語 李四 86.00 82.00 92.00 王五 82.00 94.00 82.00 張三 82.00 85.00 90.00 */ --2.靜態sql行轉列,該sql指定了轉換的列頭,該語句必須sqlserver2005及以上版本才能使用 select username 姓名,語文,數學,外語 from tb_RowConvertToColumn pivot(max(score) for course in(語文,數學,外語)) a /* 姓名 語文 數學 外語 李四 86.00 82.00 92.00 王五 82.00 94.00 82.00 張三 82.00 85.00 90.00 */ select * from tb_RowConvertToColumn pivot(max(score)for course in (語文,數學,外語)) a /* username 語文 數學 外語 李四 86.00 82.00 92.00 王五 82.00 94.00 82.00 張三 82.00 85.00 90.00 */ --3.動態sql行轉列,自動生成轉換的列 declare @sql nvarchar(2000) select distinct course into #tb_group from tb_RowConvertToColumn order by course desc--表頭及排序 select @sql=ISNULL(@sql+',','')+'MAX(case course when '''+course+''' then score else 0 end) ['+course+']' from #tb_group set @sql='select username 姓名,'+@sql +' from tb_RowConvertToColumn a' +' group by username' exec(@sql) drop table #tb_group /* 姓名 語文 外語 數學 李四 86.00 92.00 82.00 王五 82.00 82.00 94.00 張三 82.00 90.00 85.00 */ --4.動態sql行轉列,自動生成轉換的列,該語句必須sqlserver2005及以上版本才能使用 declare @sql nvarchar(2000) select @sql=ISNULL(@sql+',','')+course from tb_RowConvertToColumn group by course set @sql='select * from tb_RowConvertToColumn pivot (max(score) for course in ('+@sql+')) a' exec(@sql) /* username 數學 外語 語文 李四 82.00 92.00 86.00 王五 94.00 82.00 82.00 張三 85.00 90.00 82.00 */
--建立列轉行表及插入數據 create table tb_ColumnConvertToRow ( [姓名] nvarchar(100) null, [語文] nvarchar(100) null, [數學] nvarchar(100) null, [外語] nvarchar(100) null ) insert into tb_ColumnConvertToRow(姓名,語文,數學,外語) values('李四',82,92,86) insert into tb_ColumnConvertToRow(姓名,語文,數學,外語) values('王五',94,82,82) insert into tb_ColumnConvertToRow(姓名,語文,數學,外語) values('張三',85,90,82) --1.靜態sql列轉行,當列頭較少時使用 select * from ( select 姓名,課程='語文',分數=語文 from tb_ColumnConvertToRow union all select 姓名,課程='數學',分數=數學 from tb_ColumnConvertToRow union all select 姓名,課程='外語',分數=外語 from tb_ColumnConvertToRow ) a /* 姓名 課程 分數 李四 語文 82 王五 語文 94 張三 語文 85 李四 數學 92 王五 數學 82 張三 數學 90 李四 外語 86 王五 外語 82 張三 外語 82 */ --2.靜態sql列轉行,當列頭較少時使用,該語句必須sqlserver2005及以上版本才能使用 select 姓名,課程,分數 from tb_ColumnConvertToRow unpivot(分數 for 課程 in (語文,數學,外語)) a /* 姓名 課程 分數 李四 語文 82 李四 數學 92 李四 外語 86 王五 語文 94 王五 數學 82 王五 外語 82 張三 語文 85 張三 數學 90 張三 外語 82 */