表A中有字段 JH(井号),YPPH(样品编号),JCXM(检测项目),YPSL(样品数量) 主键(JH,YPPH,JCXM)联合主键
数据:       深1        201006            水分析             2
             深1        201006            油分析             3
             深1井      201006            水分析             2
             深1井      201007            油分析             1
             黑2井      201007            油分析             4
             黑2        201007            油分析             3
             木C-1源井  201007            气分析             5
             木3        201007            气分析             3
由于人员操作问题,井号出错,其实深1和深1井是同一口井。我的问题是现在想把这张表的井号的数据去掉最后的‘井’字,但最后是‘源井’的不去掉。然后把同一井号、样品批号、检测项目的记录合并成一条记录,最后结果是这样的:
             JH          YPPH              JCXM            YPSL
数据:       深1        201006            水分析             4
             深1        201006            油分析             3            
             深1        201007            油分析             1
             黑2        201007            油分析             7
             木C-1源井  201007            气分析             5
             木3        201007            气分析             3
注意JH和YPSL的变化
求sql或存储过程
我的数据库是ORACLE

解决方案 »

  1.   

    update a set jh=substr(jh,长度-2) where jh not like '%源井' and jh like '%井';
    (substr函数的用法自己看下,这里可能不对)select jh,ypph,jcxm,sum(ypsl) from a group by jh,ypph,jcxm;
      

  2.   

    我用的是
    update a set jh=substr(jh,1,长度-1) where jh not like '%源井' and jh like '%井';
    但是这样更新后主键有重复的,报错。而且我要的结果不只是改JH字段,还要修改井号后把同一井号、样品批号、检测项目的记录合并成一条记录,然后把原来JH末尾带‘井’号 的记录删掉。看看我给的结果。谢谢你的关注。
      

  3.   

    --更新原表中的jh字段update a set jh = replace(jh,'井') where instr(jh,'源井') = 0;下面的查询语句可以得到你想要的结果
    可以通过重新创建一个表 把这里得到的数据插入到新表中
    删除掉原表 再rename新表为原表名就可以了select jh,ypph,jcxm,sum(ypsl) ypsl from a group by jh,ypph,jcxm;
      

  4.   

    SQL> select * from a;
     
    JH                   YPPH                 JCXM                       YPSL
    -------------------- -------------------- -------------------- ----------
    深1                  201006               水分析                        2
    深1                  201006               油分析                        3
    深1井                201006               水分析                        2
    深1井                201007               油分析                        1
    黑2井                201007               油分析                        4
    黑2                  201007               油分析                        3
    木C-1源井            201007               气分析                        5
    木3                  201007               气分析                        3
     
    8 rows selected
     
    SQL> select (case when instr(jh,'源井') = 0 then replace(jh,'井') else jh end) as jh,ypph,jcxm,sum(ypsl) ypsl from a group by (case when instr(jh,'源井') = 0 then replace(jh,'井') else jh end),ypph,jcxm;
     
    JH                   YPPH                 JCXM                       YPSL
    -------------------- -------------------- -------------------- ----------
    木C-1源井            201007               气分析                        5
    木3                  201007               气分析                        3
    黑2                  201007               油分析                        7
    深1                  201007               油分析                        1
    深1                  201006               水分析                        4
    深1                  201006               油分析                        3
     
    6 rows selected
      

  5.   

    select jh,ypph,jcxm, sum(ypsl)
    from( 
    select case when substr(jh,-2,1) in  ('0','1','2','3','4','5','6','7','8','9') and substr(jh,-1,1)='井'  then 
    replace(translate(jh,'0123456789','$'),'$',null) else jh end  as jh,ypph,JCXM,ypsl  from A ) 
    group by jh,ypph,jcxm;或者用正则regexp_substr做,不过我不太会。
      

  6.   

    用#5楼的SELECT 查询法,将输入插入一张新的表内,表结构必须一致,但先不要建索引和主键,等到数据都插入到新表后,将原表删除,新表改名,之后再创建主键和索引还有默认值等相关信息,这样就完成了你要的操作了。如果必须在原表上改动,那只能使用游标更新,无法直接UPDATE操作。
      

  7.   

    你可以选择使用我在3#说的方法啊
    创建一个新表-通过那个select插入数据到新表中-删除原表-更新新表为原表名
      

  8.   

    谁能说说5楼那个sql语句的意思?我看不太懂
      

  9.   

    SELECT b.jh,b.YPPH,b.JCXM ,SUM(YPSL) FROM (select decode(instr(jh,'源井') ,0,REPLACE(JH,'井',''),jh) jh,YPPH,JCXM ,YPSL from A) b
    group BY b.jh,b.YPPH,b.JCXM ;
      

  10.   

    这个就可以貌似select decode(instr(jh,'源井') ,0,REPLACE(JH,'井',''),jh) jh,YPPH,JCXM ,sum(YPSL )from A
    group BY decode(instr(jh,'源井') ,0,REPLACE(JH,'井',''),jh) jh,YPPH,JCXM ;
      

  11.   

    select (case when instr(jh,'源井') = 0 then replace(jh,'井') else jh end) as jh,ypph,jcxm,sum(ypsl) ypsl from a group by (case when instr(jh,'源井') = 0 then replace(jh,'井') else jh end),ypph,jcxm;--可能楼主看不懂的就是这一句吧
    case when instr(jh,'源井') = 0 then replace(jh,'井') else jh endinstr(jh,'源井') 这个条件的用处就是判断这一列的值里是否包含源井 如果有的话 返回非零值 没有的话返回0返回非零值的时候代表着这一列包含源井 那么就不做处理
    返回0 就代表是包含井或者没有井 这个时候只需要使用replace(jh,'井')把井取掉就可以了
    这样的话对于深1井和深1 在经过replace(jh,'井')处理后就一样了
    在分组的时候就可以分到同一组并进行合计SUM了
      

  12.   

    估计你们又是CASE WHEN又是DECODE的,把LZ给搞晕了,哈哈哈哈