行列转换

来源:互联网 发布:java代码格式化快捷键 编辑:程序博客网 时间:2024/04/30 03:06

 

1. 行列转换--普通

假设有张学生成绩表(CJ)如下
[姓名]  [学科]  [成绩]
张三    语文    80
张三    数学    90
张三    物理    85
李四    语文    85
李四    数学    92
李四    物理    82
王五    数学    60

想变成    
[姓名] [语文] [数学] [物理]
张三   80     90     85
李四   85     92     82
王五   null   60     null

declare @sql varchar(4000)
set @sql = 'select 姓名'
select @sql = @sql + ',sum(case 学科 when ''' 学科 ''' then 成绩 end) as ' 学科
  from (select distinct 学科 from CJ) as a
set @sql = @sql ' from cj group by 姓名'
exec(@sql)


2. 行列转换--合并

有表A,
id pid
1   1
1   2
1   3
2   1
2   2
3   1
如何化成表B:
id pid
  1  1,2,3
  2  1,2
  3  1

创建一个合并的函数
create function fmerg(@id int)
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str=''
select @str=@str ',' cast(pid as varchar) from 表A where id=@id
set @str=right(@str,len(@str)-1)
return(@str)
end
go

--调用自定义函数得到结果
select distinct id,dbo.fmerg(id) from 表A