表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 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
(substr函数的用法自己看下,这里可能不对)select jh,ypph,jcxm,sum(ypsl) from a group by jh,ypph,jcxm;
update a set jh=substr(jh,1,长度-1) where jh not like '%源井' and jh like '%井';
但是这样更新后主键有重复的,报错。而且我要的结果不只是改JH字段,还要修改井号后把同一井号、样品批号、检测项目的记录合并成一条记录,然后把原来JH末尾带‘井’号 的记录删掉。看看我给的结果。谢谢你的关注。
可以通过重新创建一个表 把这里得到的数据插入到新表中
删除掉原表 再rename新表为原表名就可以了select jh,ypph,jcxm,sum(ypsl) ypsl from a group by jh,ypph,jcxm;
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
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做,不过我不太会。
创建一个新表-通过那个select插入数据到新表中-删除原表-更新新表为原表名
group BY b.jh,b.YPPH,b.JCXM ;
group BY decode(instr(jh,'源井') ,0,REPLACE(JH,'井',''),jh) jh,YPPH,JCXM ;
case when instr(jh,'源井') = 0 then replace(jh,'井') else jh endinstr(jh,'源井') 这个条件的用处就是判断这一列的值里是否包含源井 如果有的话 返回非零值 没有的话返回0返回非零值的时候代表着这一列包含源井 那么就不做处理
返回0 就代表是包含井或者没有井 这个时候只需要使用replace(jh,'井')把井取掉就可以了
这样的话对于深1井和深1 在经过replace(jh,'井')处理后就一样了
在分组的时候就可以分到同一组并进行合计SUM了