导航
  • 主页
  • 基础类
  • 应用实例
  • 新技术前沿

高難度sql轉換語句,歡迎挑戰

jackeyabc 2008-01-14 04:56:46


a b c
2004/11/09 0000000001 16:35
2004/11/09 0000000001 16:38
2004/11/09 0000000001 16:44
2004/11/09 0000000002 20:30
2004/11/09 0000000002 22:22
2004/11/09 0000000001 23:36
2004/11/11 0000000003 23:42
2004/11/09 0000000001 23:47
2004/11/09 0000000003 00:11
2004/11/10 0000000001 00:49


date 0000000001 0000000002 0000000003
2004/11/09 16:35 20:30 00:11
2004/11/09 16:38 22:22
2004/11/09 16:44
2004/11/09 23:36
2004/11/09 23:47
2004/11/10 00:49
2004/11/11 23:42
...全文
533 点赞 收藏 33
写回复
33 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
tanjun132 2008-01-15
学习了
回复
zkcq2004 2008-01-15
mark!
回复
nettman 2008-01-15
Mark!
回复
laowang2 2008-01-15
up
回复
ClsData 2008-01-15
龟龟,把你的大脑卖我二两好不好啊
回复
huleyin 2008-01-14
真是要好好学习了啊
回复
sendling 2008-01-14
很久没来了,看到好东西学习了下!
回复
changjiangzhibin 2008-01-14
呜,学习
回复
dawugui 2008-01-14
谢谢.
估计要两年时间.
回复
jackeyabc 2008-01-14
dawugui
祝福你早日升鑽石
回复
jackeyabc 2008-01-14
dawugui

多謝一下

謝謝你的幫助,有機會再請你指教

回复
liangCK 2008-01-14
这个题目在SQL CookBook这本书里有类似的题
回复
liangCK 2008-01-14
是的..
毁你声誉了..
回复
dawugui 2008-01-14
小梁同志,看来你还没学到家啊.
回复
liangCK 2008-01-14
顶老乌龟..
回复
dawugui 2008-01-14
好象是对了,可以给分了,谢谢.
回复
liangCK 2008-01-14

--示例数据
create table tb(A int,B int,C int,D int)
insert tb select 1,2 ,3 ,4
union all select 5,6 ,7 ,8
union all select 9,10,11,12
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+'=''[字段1]='''''+name+''''''''
,@s3=@s3+'
,@'+@i+'=@'+@i+'+'',[字段''+cast(@i 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

select @s1=stuff(@s1,1,1,'')
,@s2=stuff(@s2,1,1,'')
,@s4=stuff(@s4,1,1,'')
,@s5=stuff(@s5,1,15,'')

exec('declare '+@s1+',@i int
select '+@s2+'
set @i=1
select @i=@i+1'+@s3+'
from tb
select '+@s4+'
exec('+@s5+')')
go

--删除测试表
drop table tb

/*--测试结果

字段1 字段2 字段3 字段4
---- ----------- ----------- -----------
A 1 5 9
B 2 6 10
C 3 7 11
D 4 8 12

(所影响的行数为 4 行)
--*/
回复
dawugui 2008-01-14
create table tb(a varchar(10),b varchar(10),c varchar(10))
insert into tb values('2004/11/09', '0000000001', '16:35')
insert into tb values('2004/11/09', '0000000001', '16:38')
insert into tb values('2004/11/09', '0000000001', '16:44')
insert into tb values('2004/11/09', '0000000002', '20:30')
insert into tb values('2004/11/09', '0000000002', '22:22')
insert into tb values('2004/11/09', '0000000001', '23:36')
insert into tb values('2004/11/11', '0000000003', '23:42')
insert into tb values('2004/11/09', '0000000001', '23:47')
insert into tb values('2004/11/09', '0000000003', '00:11')
insert into tb values('2004/11/10', '0000000001', '00:49')
go

declare @sql varchar(8000)
set @sql = 'select a'
select @sql = @sql + ' , max(case b when ''' + b + ''' then c else '' '' end) [' + b + ']'
from (select distinct b from tb) as a
set @sql = @sql + ' from (select px = (select count(1) from tb where a = t.a and b = t.b and c < t.c) + 1 , * from tb t) m group by a,px order by a,px'
exec(@sql)

drop table tb

/*
a 0000000001 0000000002 0000000003
---------- ---------- ---------- ----------
2004/11/09 16:35 20:30 00:11
2004/11/09 16:38 22:22
2004/11/09 16:44
2004/11/09 23:36
2004/11/09 23:47
2004/11/10 00:49
2004/11/11 23:42
*/
回复
liangCK 2008-01-14
老大的.

--行列转换示例1

--测试数据
create table 表(类别 varchar(10),男性 decimal(20,1),女性 decimal(20,1))
insert 表 select '小说',38.0,59.2
union all select '散文',18.9,30.6
union all select '哲学',16.2,10.2
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(['+name+'] as varchar)'
,@s4=@s4+',@'+@i+'=''select ''+@'+@i
,@s5=@s5+'+'' union all ''+@'+@i
,@i=cast(@i as int)+1
from syscolumns
where object_id('表')=id and name<>'类别'

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 表
select '+@s4+'
exec('+@s5+')')
go

--删除测试
drop table 表

/*--测试结果
性别 小说 散文 哲学
---- ----- ----- -----
男性 38.0 18.9 16.2
女性 59.2 30.6 10.2

(所影响的行数为 2 行)
--*/
回复
jackeyabc 2008-01-14
最好用原始數據,並且b列是不固定的

多謝

這個不是簡單的列轉換關系
回复
发动态
发帖子
MS-SQL Server
创建于2007-09-28

3.2w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
社区公告
暂无公告