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
假设有张学生成绩表(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