CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  应用实例

关于数值组合的问题。

楼主CYHhelloworld()2006-06-02 18:10:59 在 MS-SQL Server / 应用实例 提问

请教,数据表内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

相关问题

关键词

得分解答快速导航

  • 帖主:CYHhelloworld
  • WangZWang
  • Haiwer

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo