关于数值组合的问题。
请教,数据表内sNo内有以下值:
DMC060001
DMC060002
DMC060003
DMC060006
DMC060007
DMC060010
DMC060014
用什么方法可以显示
DMC060001-060003,DMC060006-060007,DMC060010,DMC060014的格式?
也就是说在表内如果存连续的号码,用 号码头'-'号码尾 表示区间,如果没有区间,用一个号码表示。
向各位大侠请教,谢谢!
--环境配置如下:
Create table #Temp(sNo varchar(50))
Insert into #Temp values('DMC060001')
Insert into #Temp values('DMC060002')
Insert into #Temp values('DMC060003')
Insert into #Temp values('DMC060006')
Insert into #Temp values('DMC060007')
Insert into #Temp values('DMC060010')
Insert into #Temp values('DMC060014')
问题点数:100、回复次数:7Top
1 楼CYHhelloworld()回复于 2006-06-02 18:12:56 得分 0
这个问题困扰我一下午了。。希望能有人帮忙解决。谢谢!!!
Top
2 楼sxycgxj(云中客)回复于 2006-06-02 18:18:48 得分 0
declare @str varchar(800)
set @str=","
select @str=@str + sNO from #Temp
select right(@str,len(@str)-1)Top
3 楼sxycgxj(云中客)回复于 2006-06-02 18:20:06 得分 0
如果在数据表中有一定的条件要求得话,可以做成函数的形式来使用Top
4 楼CYHhelloworld()回复于 2006-06-02 19:17:30 得分 0
不是简单的筛选,存在一定的组合关系,如DMC060001,DMC060002,DMC060003显示为DMC060001-060003Top
5 楼WangZWang(先来)回复于 2006-06-02 19:23:01 得分 70
DECLARE @Temp table (sNo varchar(50) primary key)
Insert into @Temp values('DMC060001')
Insert into @Temp values('DMC060002')
Insert into @Temp values('DMC060003')
Insert into @Temp values('DMC060006')
Insert into @Temp values('DMC060007')
Insert into @Temp values('DMC060010')
Insert into @Temp values('DMC060014')
Insert into @Temp values('DMC060016')
Insert into @Temp values('DMC060017')
Insert into @Temp values('DMC060018')
DECLARE @str varchar(20),
@Re varchar(8000),
@New bit,
@Old bit,
@EndStr varchar(20)
Select @EndStr=max(sNo) from @Temp --用作最后一次连续的判断
update @temp set
@Re =case when @Re Is NULL then sNo else @Re end ,
@New =(case when (Right(sNo,6)=Right(@str,6)+1) then 1 else 0 end),
@re =@re+(case when (@New=0 and @old=1) then '-'+right(@str,6)+','+sNo
when (@New=0 and @old=0) then ','+sNo
when (sNo=@EndStr) then '-'+right(sNo,6) else '' end),
@old=@New, @str=sNo
Select @Re as [组合字符]
--结果
/*
组合字符
------------------------------------------------------------------------------------
DMC060001-060003,DMC060006-060007,DMC060010,DMC060014,DMC060016-060018
*/
Top
6 楼Haiwer(海阔天空)回复于 2006-06-02 20:11:53 得分 30
--常规做法
DECLARE @Temp table (sNo varchar(50) primary key)
Insert into @Temp values('DMC060001')
Insert into @Temp values('DMC060002')
Insert into @Temp values('DMC060003')
Insert into @Temp values('DMC060006')
Insert into @Temp values('DMC060007')
Insert into @Temp values('DMC060010')
Insert into @Temp values('DMC060014')
Insert into @Temp values('DMC060016')
Insert into @Temp values('DMC060017')
Insert into @Temp values('DMC060018')
select IDENTITY (int,1,1) as id,sNo
into #1
from @Temp a
where not exists (select 1 from @Temp where sNo=left(a.sNo,3)+right('000000'+cast(right(a.sNo,6)-1 as varchar(10)),6))
order by a.sNo
select IDENTITY (int,1,1) as id,sNo
into #2
from @Temp a
where not exists (select 1 from @Temp where sNo=left(a.sNo,3)+right('000000'+cast(right(a.sNo,6)+1 as varchar(10)),6))
order by a.sNo
declare @r varchar(2000)
set @r=''
select @r=@r+case when a.sNo=b.sNo then ','+a.sNo
else ','+left(a.sNo,3)+right(a.sNo,6)+'-'+right(b.sNo,6)
end
from #1 a,#2 b
where a.id=b.id
Select right(@r,len(@r)-1) as [组合字符]
drop table #1,#2
--结果
组合字符
---------------------------------------------------------------------------------DMC060001-060003,DMC060006-060007,DMC060010,DMC060014,DMC060016-060018
(所影响的行数为 1 行)
Top
7 楼CYHhelloworld()回复于 2006-06-02 20:54:10 得分 0
试了一下,,效果出来了。。但是有点看不懂。。。不知道一大堆变量的套加起的作用。
只有有时间再深入看一下,先解决客户的需求先哈。。
谢谢阿来哥哥,你解决了我的大问题。。
再次谢谢。
Top




