练习九 组函数应用

1 表数据

SQL> select * from contract_kangjia;

         1 VIVI                 10-10月-14     1                          1000  
         2 VIVI                 10-9月 -14     2                          1000  
         3 VIVI                 10-10月-14     3                          1000  
         4 LILI                 10-10月-14     1                          1000  
         5 LILI                 10-9月 -14     2                          1000  
         6 LILI                 10-10月-14     3                          1000  

已选择6行。

2 查询vivi九月与十月销售差额

效率高

create or replace procedure TEST_KANGJIA2(Name_bi in VARCHAR2,
                                          v_date1 in date,
                                          v_date2 in date) is
  /***************************************************************
  *NAME : BATCH_INSERT_TABLEA_P
  *PURPOSE : --统计某个员工两个月份销售金额差额
  *IMPUT : --  表名子
  *OUTPUT : -- N/A
  *Author : -- CICI
  *CreateDate : -- 2014、10、17
  *UpdateDate : --
  ************************************************************/
  V_diff_money NUMBER(10, 5);
  v_timer2     date;
  v_timer1     date;
  ----V_diff_timer= 6000
begin
  select sysdate into v_timer1 from dual;

  for control_val in 0 .. 111111 loop
    select STDDEV(sell_money)
      into V_diff_money
      from (select busiman_name, sell_money, sell_date
              from CONTRACT_KANGJIA
             where (sell_date = v_date1 or sell_date = v_date2)
               and busiman_name = Name_bi)
     group by busiman_name;
   -- dbms_output.put_line('V_busiman_name= ' || Name_bi);
   -- dbms_output.put_line('V_sell_money=' || V_diff_money);
   -- dbms_output.put_line('date1 =' || v_date1);
   -- dbms_output.put_line('date2 =' || v_date2);
  end loop;
  select sysdate into v_timer2 from dual;
  --计算毫秒级别时间差V_diff_timer= 6000

  dbms_output.put_line('V_diff_timer= ' ||
                       ROUND(TO_NUMBER(v_timer2 - v_timer1) * 24 * 60 * 60 * 1000));
end TEST_KANGJIA2;

  /* call
  TEST_KANGJIA2
  ('VIVI',TO_DATE('2014/09/10','YYYY/MM/DD'),TO_DATE('2014/10/10','YYYY/MM/DD'));*/

效率低

create or replace procedure diff_money_kangjia(name_business in varchar2,
                                               v_date1       in date,
                                               v_date2       in date) as
  v_diff_money varchar2(20);
  v_timer1     date;
  v_timer2     date;
begin
  select sysdate into v_timer1 from dual;

  for control_val in 0 .. 111111 loop
    select abs(a.s10 - b.s09) into v_diff_money
      from (select sum(sell_money) as s10
              from contract_kangjia
             where busiman_name = name_business
               and to_char(sell_date, 'yyyy/mm') =
                   to_char(v_date1, 'yyyy/mm')) a,
           (select sum(sell_money) as s09
              from contract_kangjia
             where busiman_name = name_business
               AND to_char(sell_date, 'yyyy/mm') =
                   to_char(v_date2, 'yyyy/mm')) b;
  end loop;
  select sysdate into v_timer2 from dual;
  --计算毫秒级别时间差V_diff_timer= 10000
  dbms_output.put_line('V_diff_timer= ' ||
                       ROUND(TO_NUMBER(v_timer2 - v_timer1) * 24 * 60 * 60 * 1000));
end diff_money_kangjia;
  /* call
  diff_money_kangjia
  ('VIVI',TO_DATE('2014/09/10','YYYY/MM/DD'),TO_DATE('2014/10/10','YYYY/MM/DD'));*/


3 查询vivi九月与十月销售差值比例

create or replace procedure TEST_KANGJIA3(Name_bi in VARCHAR2,
                                          v_date1 in date,
                                          v_date2 in date) is
  /*统计某个员工两个月份销售金额差值百分比*/
  V_diff_money VARCHAR2(20);

begin
   select   round((GREATEST (a.s,b.s)-least(a.s,b.s))/GREATEST (a.s,b.s), 2) * 100 || '%' into V_diff_money
     from (select sum(sell_money) s
             from contract_kangjia
            where busiman_name = Name_bi
              AND SELL_DATE = (To_date(v_date1, 'yyyy/mm/dd'))) a,
           (select sum(sell_money) s
                     from contract_kangjia
                    where busiman_name = Name_bi
                      AND SELL_DATE = (To_date(v_date2, 'yyyy/mm/dd'))) b;

  dbms_output.put_line('V_diff_money= ' || V_diff_money);
end TEST_KANGJIA3;

/*
call
TEST_KANGJIA3
('VIVI',TO_DATE('2014/09/10','YYYY/MM/DD'),TO_DATE('2014/10/10','YYYY/MM/DD'));
*/

 ORA-01861文字与格式字符串不匹配

原文地址:https://www.cnblogs.com/cici-new/p/4031236.html