行转列:--测试数据
create table 基础表(姓名 nvarchar(10),课程名 nvarchar(20),成绩 decimal(10,1))
insert 基础表 select '王家喜','计算机基础',69.0
union all select '王家喜','邓小平理论',74.0
union all select '王家喜','英语(上)',86.0
union all select '王家喜','普通逻辑学',91.0
union all select '施春林','立法学教程',60.0
union all select '施春林','经管原理' ,73.0
union all select '施春林','英语(上)',73.0
union all select '施春林','普通逻辑学',90.0
go--查询
declare @s varchar(8000),@i varchar(10)
select top 1 @s='',@i=count(*)
from 基础表 group by 姓名 order by count(*) desc
while @i>0
select @s=',[课程'+@i+']=max(case when id='+@i
+' then 课程名 else '''' end),[成绩'+@i
+']=max(case when id='+@i
+' then 成绩 end)'+@s
,@i=@i-1
exec('
select 姓名,课程名,成绩,id=0 into #t from 基础表 order by 姓名
declare @i int,@姓名 varchar(10)
update #t set @i=case when @姓名=姓名 then @i+1 else 1 end,id=@i,@姓名=姓名
select 姓名'+@s+' from #t group by 姓名')
go--删除测试
drop table 基础表/*--测试结果姓名 课程1 成绩1 课程2 成绩2 课程3 成绩3 课程4 成绩4
-------- ----------- ------- --------- ------ --------- ------- ---------- -------
施春林 立法学教程 60.0 经管原理 73.0 英语(上) 73.0 普通逻辑学 90.0
王家喜 计算机基础 69.0 邓小平理论 74.0 英语(上) 86.0 普通逻辑学 91.0
--*/
create table 基础表(姓名 nvarchar(10),课程名 nvarchar(20),成绩 decimal(10,1))
insert 基础表 select '王家喜','计算机基础',69.0
union all select '王家喜','邓小平理论',74.0
union all select '王家喜','英语(上)',86.0
union all select '王家喜','普通逻辑学',91.0
union all select '施春林','立法学教程',60.0
union all select '施春林','经管原理' ,73.0
union all select '施春林','英语(上)',73.0
union all select '施春林','普通逻辑学',90.0
go--查询
declare @s varchar(8000),@i varchar(10)
select top 1 @s='',@i=count(*)
from 基础表 group by 姓名 order by count(*) desc
while @i>0
select @s=',[课程'+@i+']=max(case when id='+@i
+' then 课程名 else '''' end),[成绩'+@i
+']=max(case when id='+@i
+' then 成绩 end)'+@s
,@i=@i-1
exec('
select 姓名,课程名,成绩,id=0 into #t from 基础表 order by 姓名
declare @i int,@姓名 varchar(10)
update #t set @i=case when @姓名=姓名 then @i+1 else 1 end,id=@i,@姓名=姓名
select 姓名'+@s+' from #t group by 姓名')
go--删除测试
drop table 基础表/*--测试结果姓名 课程1 成绩1 课程2 成绩2 课程3 成绩3 课程4 成绩4
-------- ----------- ------- --------- ------ --------- ------- ---------- -------
施春林 立法学教程 60.0 经管原理 73.0 英语(上) 73.0 普通逻辑学 90.0
王家喜 计算机基础 69.0 邓小平理论 74.0 英语(上) 86.0 普通逻辑学 91.0
--*/
数据 : 2003 清华同方 3.39 1.35 0.15 10.6 5.6
2003 北大方正 3.0 1.6 0.21 15.3 6.5
2004 清华同方 4.20 1.50 0.13 12.3 6.3
2004 北大方正 3.5 1.68 0.16 14.3 6.0
转换临时表 b为:
时间 2003 2004 2003 2004
企业名称 清华同方 清华同方 北大方正 北大方正
流动比率 3.39 4.20 3.0 3.5
速动比率 1.35 1.50 1.6 1.68
现金比率 0.15 0.13 0.21 0.16
现金流动负债比率 10.6 12.3 15.3 14.3
现金负债比率 5.6 6.3 6.5 6.0
要求:建立一个去读不同表实现无论是table的字段还是它的记录都由横排转换为竖排,
有没有人做过相关的转换,给我提示吧,有代码更好!!!
---------------------------------------------------------------
create table eg(
A INT NULL,
B VARCHAR(8) NULL,
C VARCHAR(8) NULL
)
INSERT INTO EG
SELECT 1, 'long', '50' UNION ALL
SELECT 1, 'width', '20' UNION ALL
SELECT 1, 'unit', 'm' UNION ALL
SELECT 1 , 'high',''
SELECT * FROM EG
------------------------------------------------------
Declare @s varchar(300)
set @s=''
select @s=@s+B+':'+C+',' from eg where B<>'' and B is not null And C<>'' and c is not null
set @s=left(@s,len(@s)-1)
select @s
---------------------結果-----------------
长:50,宽:20,单位:米
drop table EG
---------------------------------------------------------------
--示例数据
create table tb(
时间 int,企业名称 nvarchar(10),
流动比率 decimal(10,2),速动比率 decimal(10,2),现金比率 decimal(10,2),
现金流动负债比率 decimal(10,1),现金负债比率 decimal(10,1))
insert tb select 2003,'清华同方',3.39,1.35,0.15,10.6,5.6
union all select 2003,'北大方正',3.0 ,1.6, 0.21,15.3,6.5
union all select 2004,'清华同方',4.20,1.50,0.13,12.3,6.3
union all select 2004,'北大方正',3.5 ,1.68,0.16,14.3,6.0
go
declare @s1 varchar(8000),@s2 varchar(8000)
,@s3 varchar(8000),@s4 varchar(8000),@s5 varchar(8000)
,@i varchar(10)
select @s1='',@s2='',@s3='',@s4='',@s5='',@i='0'
select @s1=@s1+',@'+@i+' varchar(8000)'
,@s2=@s2+',@'+@i+'=''时间='''''+name+''''''''
,@s3=@s3+'
,@'+@i+'=@'+@i+'+'',[''+cast([时间] as varchar)+'']=''''''+cast(['+name+'] as varchar)+'''''''''
,@s4=@s4+',@'+@i+'=''select ''+@'+@i
,@s5=@s5+'+'' union all ''+@'+@i
,@i=cast(@i as int)+1
from syscolumns
where object_id('tb')=id and colid>1
order by colid
select @s1=stuff(@s1,1,1,'')
,@s2=stuff(@s2,1,1,'')
,@s3=stuff(@s3,1,4,'')
,@s4=stuff(@s4,1,1,'')
,@s5=stuff(@s5,1,15,'')
exec('declare '+@s1+'
select '+@s2+'
select '+@s3+'
from tb
select '+@s4+'
exec('+@s5+')')
go
--删除测试
drop table tb
/*--结果
时间 2003 2003 2004 2004
---------------- -------- -------- -------- --------
企业名称 清华同方 北大方正 清华同方 北大方正
流动比率 3.39 3.00 4.20 3.50
速动比率 1.35 1.60 1.50 1.68
现金比率 0.15 0.21 0.13 0.16
现金流动负债比率 10.6 15.3 12.3 14.3
现金负债比率 5.6 6.5 6.3 6.0
(所影响的行数为 6 行)
create table [user](
userid varchar(10),
username varchar(10),
userbirth datetime,
userage int
)
insert [user] select 'aa','清华同方',getdate(),10
union all select 'bb','北大方正',getdate(),20
go
declare @s1 varchar(8000),@s2 varchar(8000)
,@s3 varchar(8000),@s4 varchar(8000),@s5 varchar(8000)
,@i varchar(10)
select @s1='',@s2='',@s3='',@s4='',@s5='',@i='0'
select @s1=@s1+',@'+@i+' varchar(8000)'
,@s2=@s2+',@'+@i+'=''userid='''''+name+''''''''
,@s3=@s3+'
,@'+@i+'=@'+@i+'+'',[''+cast([userid] as varchar)+'']=''''''+cast(['+name+'] as varchar)+'''''''''
,@s4=@s4+',@'+@i+'=''select ''+@'+@i
,@s5=@s5+'+'' union all ''+@'+@i
,@i=cast(@i as int)+1
from syscolumns
where object_id('user')=id and colid>1
order by colid
select @s1=stuff(@s1,1,1,'')
,@s2=stuff(@s2,1,1,'')
,@s3=stuff(@s3,1,4,'')
,@s4=stuff(@s4,1,1,'')
,@s5=stuff(@s5,1,15,'')
exec('declare '+@s1+'
select '+@s2+'
select '+@s3+'
from [user]
select '+@s4+'
exec('+@s5+')')
go
====CSDN 小助手 V2.0 2005年10月16日发布====
CSDN小助手是一款脱离浏览器也可以访问Csdn论坛的软件
界面:http://blog.csdn.net/Qqwwee_Com/archive/2005/10/16/504620.aspx
下载:http://szlawbook.com/csdnv2/csdnv2.rar为神六喝彩,向所有科技工作者致敬!
拒绝日货。