主题:[color=FF0000][b]关于数据库查询[/b][/color]
jinfreaks
[专家分:0] 发布于 2006-07-24 15:24:00
A列 B列 C列 D列
1 甲 a 13:8,24:5,51:16,52:4,
2 乙 b 13:8,24:5,51:16,52:4,74:1,
3 丙 c 51:16,52:4,53:2,57:1,64:17,
4 丁 d 13:8,24:5,57:1,64:17,74:1,
5 戊 e 24:5,74:1,
这张表中我要求得到D列中的值做一张Excel表格如下
A列 关于13 关于24 关于51 关于52 关于53 关于57 关于64 关于74
1 8 5 16 4 0 0 0 0
2 8 5 16 4 0 0 0 1
3 0 0 16 4 2 1 17 1
4 8 5 0 0 0 0 17 1
5 0 5 0 0 0 0 0 1
就是将冒号前得数据作为列号,冒号后得数据作为值,要包含所有D列中有的列号,没有该列号的表中的值为 "0"
回复列表 (共8个回复)
沙发
jinfreaks [专家分:0] 发布于 2006-07-24 16:26:00
顶一下,兄弟们帮忙解决一下啊
高手们
板凳
233238447 [专家分:1350] 发布于 2006-07-24 19:16:00
你几时要,说,我帮你做做看!
3 楼
233238447 [专家分:1350] 发布于 2006-07-24 23:54:00
帮你做出来了,你只要后半部分,照着做,就 OK 了,我是跟你把:前面的值己取出,详细看代码,导入到EXCEL,简单!嗯,这个题目不错,考的是 字符串函数应用!
记得,要想完成你所有的功能,还要写一些代码!我只是告诉你怎么提取行里特定的值,并保存起来!
如果写完的话,估计要写 8K 左右,其它功能都简单!
use master
go
if exists(select name from sysdatabases where name='java')
drop database java
go
create database java
go
set nocount on
go
if exists(select name from sysobjects where name='a')
drop table a
go
create table a
(
a varchar(10),
b varchar(10),
c varchar(10),
d varchar(50)
)
go
insert into a values('a','1','不','10:12,56:78,16:45,69:45')
insert into a values('b','2','不','50:18,56:78,9:45,69:45')
insert into a values('c','3','不','98:12,68:78,15:53,69:45')
insert into a values('d','4','不','10:12,56:78,7:45,69:45')
insert into a values('e','5','不','10:12,56:78,58:45,69:45')
insert into a values('f','6','不','45:2,3:78,7:45,69:45')
go
-------------------以上是测试表以及测试数据-------------------------
declare @trim varchar(5)
declare @ho varchar(100)
declare @le varchar(20)
declare @j varchar(50)
declare @h varchar(20)
declare @k varchar(20)
declare @p int
declare @no int
declare @ko int
declare @str varchar(400)
declare @ln int
declare @yong int
declare @xx int
set @xx=0
set @p=0
set @yong=3
set @trim=' '
set @ko=0
set @no=1
set @h=','
set @k=':'
set @j=''
set @ho=''
set @str=','
while(1=1)
begin
set @no=@no+1
set @ko=0
SET ROWCOUNT @no --控制返回行数
select @j=d from a
print @J
--------去空格-------
set @j=ltrim(@j)
set @j=rtrim(@j)
--------返回长度-----
set @ln=len(@j)
select @xx=count(*) from a
if(@no<=@xx) --退出条件
begin
while(1=1)
begin
set @ko=@ko+1
declare @iii int
declare @hhh varchar(100)
declare @jjj varchar(20)
declare @ff int
declare @jim varchar(300)
set @ff=0
set @iii=@ln
if(@ko=1)
begin
--------------防止重复的值出现------------
set @ff=charindex(@k,@j,@p)
set @hhh=substring(@j,0,@ff)
print @hhh
---------将,去掉,将:去掉,查找是否存在重复的字符串,如果存出转成ff
set @hhh=replace(@hhh,@k,'')
set @hhh=replace(@hhh,',','')
set @hhh=replace(@str,@hhh,'fggggggg')
print @str
print @hhh
if(@hhh=@str) --比较,如果不是相重复,就加入 @str中
begin
print '获取的是'+substring(@j,0,@ff)
set @str=@str+substring(@j,0,@ff)
set @str=@str
end
end
--------------核心--------------------
set @yong=charindex(@k,@j,@p)
set @p=charindex(@h,@j,@yong)
-------------------------------------
if(@p=0 or @yong=0) --退出条件,因为如果它在某字符串中找不到相对应的值,它的值会变成零
begin
set @p=0
set @yong=0
set @ko=0
break
end
declare @bv int
set @bv=@p-@yong
set @jjj=substring(@j,@p,@bv)
set @jim=replace(@jjj,@k,'')
set @jim=replace(@jim,',','')
set @jim=replace(@str,@jim,'ff')
if(@jim=@str)
begin
set @str=@STR+substring(@j,@p,@bv)+','
end
end
end
else
break
end
set @str=replace(@str,@k,'')
set @str=replace(@str,',',' ')
print @str
4 楼
jinfreaks [专家分:0] 发布于 2006-08-04 14:06:00
谢谢了,很久没有上来看了,不过是不是复杂了点?有点看不懂,最近工作比较忙没有时间来做这件事了,谢谢!我再试试看能不能用!
5 楼
233238447 [专家分:1350] 发布于 2006-08-04 20:58:00
不复杂啊,一点都不复杂,还有比这更复杂的!
6 楼
jinfreaks [专家分:0] 发布于 2006-08-08 11:38:00
执行的时候会不会很占内存呢?或者很耗费时间?[em2]
7 楼
233238447 [专家分:1350] 发布于 2006-08-08 20:09:00
不会很占内存,因为,没用到连接,和游标
其它代码并不多,只是创建表!~
8 楼
233238447 [专家分:1350] 发布于 2006-08-18 14:08:00
魂牵梦萦魂牵梦萦
我来回复