sqlserver行列轉換

  • sqlserver行轉列
--建立行轉列表及插入數據
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
*/
  • sqlserver列轉行
--建立列轉行表及插入數據
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
*/
相關文章
相關標籤/搜索