回 帖 发 新 帖 刷新版面

主题:[color=FF0000][b]关于数据库查询[/b][/color]

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个回复)

沙发

顶一下,兄弟们帮忙解决一下啊
高手们

板凳

你几时要,说,我帮你做做看!

3 楼

帮你做出来了,你只要后半部分,照着做,就 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 楼

谢谢了,很久没有上来看了,不过是不是复杂了点?有点看不懂,最近工作比较忙没有时间来做这件事了,谢谢!我再试试看能不能用!

5 楼

不复杂啊,一点都不复杂,还有比这更复杂的!

6 楼

执行的时候会不会很占内存呢?或者很耗费时间?[em2]

7 楼

不会很占内存,因为,没用到连接,和游标
其它代码并不多,只是创建表!~

8 楼

魂牵梦萦魂牵梦萦 

我来回复

您尚未登录,请登录后再回复。点此登录或注册