下面所用过程中表 ucr_bc1.tg_cdr04,在1月份时将是tg_cdr01,2月份是tg_cdr02,一直到12,这个过程怎么改造一下,在5月份提取tg_cdr04数据,6月份提取tg_cdr05的数据,以此类推,以满足一年的需要?CREATE OR REPLACE PROCEDURE p_test AUTHID CURRENT_USER AS
BEGIN
  BEGIN
  EXECUTE IMMEDIATE 'drop table ty_04';
  EXCEPTION
  WHEN OTHERS THEN
  NULL;
  END;  EXECUTE IMMEDIATE 'create table ty_04 as  
  select b.lac, b.ci, b.name,a.msisdn,count(*) count
  from ucr_bc1.tg_cdr04@ngbil a, tyjz b
  where a.lac1 = b.lac
  and a.cell_id1 = b.ci
  group by b.lac, b.ci, b.name,a.msisdn';  BEGIN
  EXECUTE IMMEDIATE 'drop table ty_04_jg';
  EXCEPTION
  WHEN OTHERS THEN
  NULL;
  END;
   
  EXECUTE IMMEDIATE 'create table ty_04_jg as  
  select *
  from (select name,
  lac,
  ci,
  msisdn,
  count,
  row_number() over(partition by msisdn order by count desc) rn
  from ty_04)
  where rn = 1';
END;
/

解决方案 »

  1.   

    CREATE OR REPLACE PROCEDURE p_test AUTHID CURRENT_USER AS
    BEGIN
      BEGIN
      EXECUTE IMMEDIATE 'drop table ty_'||to_char(sysdate,'mm');
      EXCEPTION
      WHEN OTHERS THEN
      NULL;
      END;  EXECUTE IMMEDIATE 'create table ty_'||to_char(sysdate,'mm')||' as   
      select b.lac, b.ci, b.name,a.msisdn,count(*) count
      from ucr_bc1.tg_cdr'||to_char(sysdate,'mm')||'@ngbil a, tyjz b
      where a.lac1 = b.lac
      and a.cell_id1 = b.ci
      group by b.lac, b.ci, b.name,a.msisdn';  BEGIN
      EXECUTE IMMEDIATE 'drop table ty_'||to_char(sysdate,'mm')||'_jg';
      EXCEPTION
      WHEN OTHERS THEN
      NULL;
      END;
        
      EXECUTE IMMEDIATE 'create table ty_'||to_char(sysdate,'mm')||'_jg as   
      select *
      from (select name,
      lac,
      ci,
      msisdn,
      count,
      row_number() over(partition by msisdn order by count desc) rn
      from ty_'||to_char(sysdate,'mm')||')
      where rn = 1';
    END;
    /
      

  2.   

    CREATE OR REPLACE PROCEDURE p_test AUTHID CURRENT_USER AS
    BEGIN
      BEGIN
      EXECUTE IMMEDIATE 'drop table ty_'||to_char(sysdate,'mm');
      EXCEPTION
      WHEN OTHERS THEN
      NULL;
      END;  EXECUTE IMMEDIATE 'create table ty_'||to_char(sysdate,'mm')||' as   
      select b.lac, b.ci, b.name,a.msisdn,count(*) count
      from ucr_bc1.tg_cdr'||to_char(sysdate,'mm')||'@ngbil a, tyjz b
      where a.lac1 = b.lac
      and a.cell_id1 = b.ci
      group by b.lac, b.ci, b.name,a.msisdn';  BEGIN
      EXECUTE IMMEDIATE 'drop table ty_'||to_char(sysdate,'mm')||'_jg';
      EXCEPTION
      WHEN OTHERS THEN
      NULL;
      END;
        
      EXECUTE IMMEDIATE 'create table ty_'||to_char(sysdate,'mm')||'_jg as   
      select *
      from (select name,
      lac,
      ci,
      msisdn,
      count,
      row_number() over(partition by msisdn order by count desc) rn
      from ty_'||to_char(sysdate,'mm')||')
      where rn = 1';
    END;
    /
      

  3.   

    以上不是想要的哦,是在5月份提取4月tg_cdr04的数据,6月份提取tg_cdr05的数据,以此类推,并涉及到跨年,在1月份提取去年12月的数据
      

  4.   

    楼上两位代码中,表名处to_char(sysdate,'mm')不变,select ... from 后的to_char(sysdate,'mm')改为to_char(sysdate-1,'mm')
    不就是你想要的提取前一月份的
      

  5.   

    那跨年的问题该怎么解决呢,今年1月份的时候提去年12月的数据,利用tg_cdr12
      

  6.   

    sorry,我上面写的sysdate-1只是前一天得,前一月应该是add_months(sysdate,-1),如果当前月份为1月份,使用add_months(sysdate,-1函数取的就是去年12月份的
      

  7.   

    CREATE OR REPLACE PROCEDURE p_test AUTHID CURRENT_USER AS
    BEGIN
      BEGIN
      EXECUTE IMMEDIATE 'drop table ty_'||to_char(sysdate,'mm');
      EXCEPTION
      WHEN OTHERS THEN
      NULL;
      END;  EXECUTE IMMEDIATE 'create table ty_'||to_char(sysdate,'mm')||' as   
      select b.lac, b.ci, b.name,a.msisdn,count(*) count
      from ucr_bc1.tg_cdr'||to_char(add_months(sysdate,-1),'mm')||'@ngbil a, tyjz b
      where a.lac1 = b.lac
      and a.cell_id1 = b.ci
      group by b.lac, b.ci, b.name,a.msisdn';  BEGIN
      EXECUTE IMMEDIATE 'drop table ty_'||to_char(sysdate,'mm')||'_jg';
      EXCEPTION
      WHEN OTHERS THEN
      NULL;
      END;
        
      EXECUTE IMMEDIATE 'create table ty_'||to_char(sysdate,'mm')||'_jg as   
      select *
      from (select name,
      lac,
      ci,
      msisdn,
      count,
      row_number() over(partition by msisdn order by count desc) rn
      from ty_'||to_char(sysdate,'mm')||')
      where rn = 1';
    END;
    /
    看楼主的意思大约是这样的?