日期:2014-05-16  浏览次数:20864 次

(求高人指点指点)oracle高手过招:使用case when then替换字段数据,比实际的多了几百条数据 求解
SQL code

create or replace procedure proc4(qihao in varchar2)
is
sr_id number;
cp_id varchar2(50);
kh_id varchar2(50);
gs_id varchar2(50);

type cur is ref cursor ;
cur_cpkh cur ;

begin
   open cur_cpkh for select sum(sr) ,c.col_1_1_214_14 ,
  case s.www06 
    when 12 then 'KH09010101' 
    when 13 then'KH09010102' 
    when 14 then 'KH09010103'
    when 16 then 'KH09010201'
    when 17 then 'KH09010202'
    when 18 then 'KH09010203'
    when 20 then 'KH09010301'
    when 21 then 'KH09010302'
    when 22 then 'KH09010303'
    when 23 then 'KH09010304'
    when 25 then 'KH09010401'
    when 26 then 'KH09010402'
    when 27 then 'KH09010403'
    when 29 then 'KH09010501'
    when 30 then 'KH09010502'
    when 31 then 'KH09010503'
    when 32 then 'KH09010504'
    when 33 then 'KH09010505'
    when 34 then 'KH09010506'
    when 60 then 'KH0905'
    when 99 then 'KH0903'
    else '其他' end ,
  s.gsdm from sab4 s, cpdtb c where s.qijian=qijian  and c.col_1_1_214_3=s.www02 and c.col_1_1_214_14 is not null group by s.gsdm,  case s.www06 
    when 12 then 'KH09010101' 
    when 13 then'KH09010102' 
    when 14 then 'KH09010103'
    when 16 then 'KH09010201'
    when 17 then 'KH09010202'
    when 18 then 'KH09010203'
    when 20 then 'KH09010301'
    when 21 then 'KH09010302'
    when 22 then 'KH09010303'
    when 23 then 'KH09010304'
    when 25 then 'KH09010401'
    when 26 then 'KH09010402'
    when 27 then 'KH09010403'
    when 29 then 'KH09010501'
    when 30 then 'KH09010502'
    when 31 then 'KH09010503'
    when 32 then 'KH09010504'
    when 33 then 'KH09010505'
    when 34 then 'KH09010506'
    when 60 then 'KH0905'
    when 99 then 'KH0903'
    else '其他' end ,c.col_1_1_214_14 ;
       loop
         fetch cur_cpkh into sr_id,cp_id,kh_id,gs_id;
         exit when cur_cpkh%notfound;
         
       end loop ;
end proc4;


上面的是使用case进行替换的 将(12,13,14。。。)替换成(kh4974456。。。)这一类的数据

SQL code
select sum(sr) ,c.col_1_1_214_14 ,s.www06 ,s.gsdm from sab4 s, cpdtb c where s.qijian=201105  and c.col_1_1_214_3=s.www02 and c.col_1_1_214_14 is not null group by s.gsdm,s.www06,c.col_1_1_214_14;



第一个数据用select count(*) from 上上一张表总数是9364,下面的一张表是9041条数据

求解

------解决方案--------------------
一般记录数不匹配,就检查你的group by,如果有表连接就检查连接是否需要用到外连接,有没有用对……你例子的SQL太长,没看- -|||
------解决方案--------------------
具体没有分组group by
------解决方案--------------------
悲哀,不是 case ... when 语句的问题撒,不信:你去掉case ... when 看一下:查询是不是返回一样的数据行!


-- 是你表连接的问题!

-- 你先整清楚各表之间 的业务关系是什么?
-- 然后:整清楚各表之间的连接条件有哪些?是不是哪两个表连接的时候,您给的连接条件不够的原因!
------解决方案--------------------
我觉得可能是你case以后空值会变成‘其他’,不用case直接被is not null过滤了
------解决方案--------------------
探讨
我觉得可能是你case以后空值会变成‘其他’,不用case直接被is not null过滤了