CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  基础类

求sql语句.在线等

楼主wangkenping(找有感觉的妹妹)2005-05-27 11:00:48 在 MS-SQL Server / 基础类 提问

A1表结构  
  lsh                       fph1                       fph2  
  1                             1                           500  
  2                             501                       900  
  3                             1500                     2000  
  4                             901                       1200  
   
  怎么样生成如下数据  
  lsh                       fph1                       fph2  
  1                             1                           1200  
  3                             1500                     2000 问题点数:100、回复次数:15Top

1 楼WangZWang(先来)回复于 2005-05-27 11:06:23 得分 0

看不出你是有规律得来的,说说得来的方法Top

2 楼xhwly(wly)回复于 2005-05-27 11:07:20 得分 0

看不出什麼規律啊!  
  Top

3 楼wangkenping(找有感觉的妹妹)回复于 2005-05-27 11:09:16 得分 0

哦   是取连续啊   比如   1-500,501-900  
  合成1-900Top

4 楼aw511(点点星灯)回复于 2005-05-27 11:09:56 得分 0

请问楼主,得到下面的数据,你的fph2有什么要求,看不出一点关系啊  
  请说明数据是怎么得到的???  
   
  lsh                       fph1                       fph2  
  1                             1                           1200  
  3                             1500                     2000Top

5 楼fengfangfang()回复于 2005-05-27 11:10:08 得分 0

看出来了  
    fph2   +   1如果在fph1中有,就往下找  
   
  就是不会写  
  Top

6 楼fengfangfang()回复于 2005-05-27 11:11:44 得分 0

用游标和递归存储过程Top

7 楼zjcxc(邹建)回复于 2005-05-27 11:28:21 得分 100

--示例  
   
  --示例数据  
  create   table   A1(lsh   int,fph1   int,fph2   int)  
  insert   A1   select   1,1   ,     500  
  union   all   select   2,501   ,900  
  union   all   select   3,1500,2000  
  union   all   select   4,901   ,1200  
  go  
   
  --查询  
  select   lsh,fph1,fph2=(  
  select   min(fph2)   from   A1   aa  
  where   fph1>=a.fph1   and   not   exists(  
  select   *   from   A1   where   fph1=aa.fph2+1))  
  from   A1   a  
  where   not   exists(  
  select   *   from   A1   where   fph2=a.fph1-1)  
  go  
   
  --删除测试  
  drop   table   A1  
   
  /*--结果  
  lsh                   fph1                 fph2                  
  -----------   -----------   -----------    
  1                       1                       1200  
  3                       1500                 2000  
   
  (所影响的行数为   2   行)  
  --*/Top

8 楼realgz01(官方马甲)回复于 2005-05-27 11:33:53 得分 0

楼上的   试试  
   
  create   table   A1(lsh   int,fph1   int,fph2   int)  
  insert   A1   select   1,1   ,     500  
  union   all   select   2,501   ,900  
  union   all   select   3,1500,2000  
  union   all   select   4,901   ,1200  
  union   all   select   5,401   ,500  
  union   all   select   6,501,3000  
  union   all   select   7,44   ,55Top

9 楼libin_ftsafe(子陌红尘:TS for Banking Card)回复于 2005-05-27 11:34:43 得分 0

create   table   #T(lsh   INT,fph1   INT,fph2   INT)  
  INSERT   INTO   #T   SELECT   1,1       ,500  
  INSERT   INTO   #T   SELECT   2,501   ,900  
  INSERT   INTO   #T   SELECT   3,1500,2000  
  INSERT   INTO   #T   SELECT   4,901   ,1200  
   
  SELECT  
          C.fph1,fph2   =   MIN(D.fph2)  
  FROM  
          (SELECT   A.fph1   FROM   #T   A   WHERE   NOT   EXISTS(SELECT   1   FROM   #T   WHERE   fph2   =   A.fph1-1))   C,  
          (SELECT   A.fph2   FROM   #T   A   WHERE   NOT   EXISTS(SELECT   1   FROM   #T   WHERE   fph1   =   A.fph2+1))   D  
  WHERE  
          C.fph1<=D.fph2  
  GROUP   BY  
          C.fph1Top

10 楼realgz01(官方马甲)回复于 2005-05-27 11:37:06 得分 0

写错了,汗,一点进步也有。  
  create   table   A1(lsh   int,fph1   int,fph2   int)  
  insert   A1   select   1,1   ,     500  
  union   all   select   2,501   ,900  
  union   all   select   3,1500,2000  
  union   all   select   4,901   ,1200  
  union   all   select   5,401   ,600  
  union   all   select   6,601,3000  
  union   all   select   7,44   ,55Top

11 楼libin_ftsafe(子陌红尘:TS for Banking Card)回复于 2005-05-27 11:38:33 得分 0

--生成测试数据  
  create   table   #T(lsh   INT,fph1   INT,fph2   INT)  
  INSERT   INTO   #T   SELECT   1,1       ,500  
  INSERT   INTO   #T   SELECT   2,501   ,900  
  INSERT   INTO   #T   SELECT   3,1500,2000  
  INSERT   INTO   #T   SELECT   4,901   ,1200  
   
  --执行查询  
  SELECT  
          C.lsh,C.fph1,fph2   =   MIN(D.fph2)  
  FROM  
          (SELECT   A.lsh,A.fph1   FROM   #T   A   WHERE   NOT   EXISTS(SELECT   1   FROM   #T   WHERE   fph2   =   A.fph1-1))   C,  
          (SELECT   A.fph2   FROM   #T   A   WHERE   NOT   EXISTS(SELECT   1   FROM   #T   WHERE   fph1   =   A.fph2+1))   D  
  WHERE  
          C.fph1<=D.fph2  
  GROUP   BY  
          C.lsh,C.fph1  
           
  --输出结果  
  lsh         fph1         fph2  
  -------------------  
        1             1         1200  
        3       1500         2000  
  Top

12 楼aw511(点点星灯)回复于 2005-05-27 11:40:07 得分 0

zjcxc(邹建)    的方法好简单啊,学习!!Top

13 楼realgz01(官方马甲)回复于 2005-05-27 11:43:45 得分 0

libin_ftsafe(子陌红尘):有点意思,就是还不是完全的循环思想,还是是截前截后。  
   
  都是假定任意数据段没有交叉数据啊,如果可以这样的话,解法倒还真多~~~~  
   
  不然一句话的我只觉得似乎有一种办法,先把数据打散了再凑回来,效率么,就惨得不得了了。Top

14 楼zjcxc(邹建)回复于 2005-05-27 11:49:18 得分 0

to:   realgz01(马甲)  
  按你写的数据,你认为该什么结果呢?   你的数据形成了数据交叉,怎么判断连续性?    
   
  还是楼主出来解决吧Top

15 楼libin_ftsafe(子陌红尘:TS for Banking Card)回复于 2005-05-27 12:35:25 得分 0

to:realgz01(马甲)  
   
  即使数据存在交叉,改改查询语句也是可以解决的:  
  ---------------------------------------------------------------------------------  
  --生成测试数据  
  create   table   #T(lsh   INT,fph1   INT,fph2   INT)  
  INSERT   INTO   #T   SELECT   1   ,1       ,500  
  INSERT   INTO   #T   SELECT   2   ,501   ,900  
  INSERT   INTO   #T   SELECT   3   ,1500,2000  
  INSERT   INTO   #T   SELECT   4   ,901   ,1200  
  INSERT   INTO   #T   SELECT   5   ,2020   ,2200  
  INSERT   INTO   #T   SELECT   6   ,2180   ,2300  
  INSERT   INTO   #T   SELECT   7   ,2280   ,2400  
  INSERT   INTO   #T   SELECT   8   ,2500   ,2600  
  INSERT   INTO   #T   SELECT   9   ,2601   ,2700  
  INSERT   INTO   #T   SELECT   10,2688   ,2800  
  INSERT   INTO   #T   SELECT   10,2681   ,2780  
   
  --执行查询  
  SELECT  
          C.lsh,C.fph1,fph2   =   MIN(D.fph2)  
  FROM  
          (SELECT   A.lsh,A.fph1   FROM   #T   A   WHERE   NOT   EXISTS(SELECT   1   FROM   #T   WHERE   (A.fph1-1)   between   fph1   and   fph2))   C,  
          (SELECT   A.fph2   FROM   #T   A   WHERE   NOT   EXISTS(SELECT   1   FROM   #T   WHERE   (A.fph2+1)   between   fph1   and   fph2))   D  
  WHERE  
          C.fph1<=D.fph2  
  GROUP   BY  
          C.lsh,C.fph1Top

相关问题

  • sql语句,在线等候
  • sql语句(在线等)
  • sql语句,在线等
  • 一个sql语句,在线
  • sql语句,在线等!
  • 再求sql语句,在线
  • 在线急求SQL语句
  • 求sql语句(在线等)
  • 在线等SQL语句!
  • 在线等SQL语句

关键词

  • 数据
  • fph
  • lsh
  • union
  • table
  • select

得分解答快速导航

  • 帖主:wangkenping
  • zjcxc

相关链接

  • SQL Server类图书

广告也精彩

反馈

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