行列转换 交叉表

发表于:2007-07-02来源:作者:点击数: 标签:
总结了一些有代表性的贴子,具体见http://expert.csdn.net/Expert/topic/2440/2440306.xml?temp=.6941645 1: 列转为行: eg1: Create table test (name char(10),km char(10),cj int) go insert test values(@#张三@#,@#语文@#,80) insert test values(@#张三

总结了一些有代表性的贴子,具体见http://expert.csdn.net/Expert/topic/2440/2440306.xml?temp=.6941645

1: 列转为行:
eg1:
Create table test (name char(10),km char(10),cj int)
go
insert test values(@#张三@#,@#语文@#,80)
insert test values(@#张三@#,@#数学@#,86)
insert test values(@#张三@#,@#英语@#,75)
insert test values(@#李四@#,@#语文@#,78)
insert test values(@#李四@#,@#数学@#,85)
insert test values(@#李四@#,@#英语@#,78)

想变成

姓名   语文   数学   英语
张三   80     86     75
李四   78     85     78


declare @sql varchar(8000)
set @sql = @#select name@#
select @sql = @sql + @#,sum(case km when @#@#@#+km+@#@#@# then cj end) [@#+km+@#]@#
 from (select distinct km from test) as a
select @sql = @sql+@# from test group by name@#
exec(@sql)

drop table test

 

eg2:
有表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
或者是从表B变成A(不要用游标)
以前有相似的列子,现在找不到了,帮帮忙!


--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


2:
/***********     行转列   *****************/
测试:
create table t1 (a int,b int,c int,d int,e int,f int,g int,h int)
insert t1 values(15, 9, 1, 0, 1, 2, 2, 0)

declare @ varchar(8000)
set @=@#@#
select @=@+rtrim(name)+@# from t1 union all select @# from syscolumns where id=object_id(@#t1@#)
set @=left(@,len(@)-len(@# from t1 union all select @#))
--print @
exec(@#select @#+@+@# from t1@#)

a          
-----------
15
9
1
0
1
2
2
0

 

原文转自:http://www.ltesting.net