Search code examples
oracleplsqlplsql-package

The package ends with a failed status. ORA-00937 not so easy


PS The answers provided did not help. The error still persists. Need help if someone can still help :)

Good day. The package compiles successfully, and when I call it through a job, I get the failed status and an error

"ORA-00937: not a single-group group function ORA-06512: at "DMA.FILL_F101_ROUND_F", line 42 ORA-06512: at line 2 "

Prompt my carelessness, I use group by on non-group parameters, but the error does not go away. I understand that when using group aggregators in the select, it is necessary to indicate not group aggregators in the group. But in the end it doesn't work when calling the package. I read similar questions and everywhere it is advised to reconsider group by. I seem to have used all possible options, but did not help. Thanks in advance!

 group by
       trunc(i_OnDate, 'mm'),
       last_day(i_OnDate),
       s.chapter,
       substr(acc_d.account_number, 1, 5),
       acc_d.char_type;

My pck:

    create or replace package body dma.fill_f101_round_f is

  ----------------------------------------------------------------------------------------------------
  procedure "$Rev: 220707 $"                 is begin null; end;
  procedure "$URL:: https://svn.neoflex.ru$" is begin null; end;
  procedure "$Author:: rbubnov $"            is begin null; end;
  procedure "$Date:: 2018-12-22 12:09:59 #$" is begin null; end;

  ----------------------------------------------------------------------------------------------------
  procedure Log
  ( i_message                      in varchar2
  ) 
  is
  begin
    dma.logger.writeLog('[' || c_MartName || '] ' || i_message);
  end;
  ----------------------------------------------------------------------------------------------------

  ----------------------------------------------------------------------------------------------------
  procedure fill
  ( i_OnDate                       in date
  )
  is
  begin

    Log( '[BEGIN] fill(i_OnDate => date ''' 
         || to_char(i_OnDate, 'yyyy-mm-dd') 
         || ''');'
       );
    
    Log( 'delete on_date = ' 
         || to_char(i_OnDate, 'yyyy-mm-dd')
       );

    delete
      from dma.DM_F101_ROUND_F f
     where trunc(i_OnDate, 'mm')  =  from_date
       and last_day(i_OnDate)    =  to_date;
   
    Log('insert');
   
    insert 
      into dma.dm_f101_round_f f
           ( from_date         
           , to_date           
           , chapter           
           , ledger_account    
           , characteristic    
           , balance_in_rub    
           , balance_in_val    
           , balance_in_total  
           , turn_deb_rub      
           , turn_deb_val      
           , turn_deb_total    
           , turn_cre_rub      
           , turn_cre_val      
           , turn_cre_total    
           , balance_out_rub  
           , balance_out_val   
           , balance_out_total 
           )
    select 
           trunc(i_OnDate, 'mm')                 as from_date,
           last_day(i_OnDate)                    as to_date,
           s.chapter                             as chapter,
           substr(acc_d.account_number, 1, 5)    as ledger_account,
           acc_d.char_type                       as characteristic,
           -- RUB balance
           sum( case 
                  when cur.currency_code in ('643', '810')
                  then b.balance_out
                  else 0
                 end
              )                                  as balance_in_rub,
          -- VAL balance converted to rub
          sum( case 
                 when cur.currency_code not in ('643', '810')
                 then b.balance_out * exch_r.reduced_cource
                 else 0
                end
             )                                   as balance_in_val,
          -- Total: RUB balance + VAL converted to rub
          sum(  case 
                 when cur.currency_code in ('643', '810')
                 then b.balance_out
                 else b.balance_out * exch_r.reduced_cource
               end
             )                                   as balance_in_total  ,
           -- RUB debet turnover
           sum(case 
                 when cur.currency_code in ('643', '810')
                 then at.debet_amount_rub
                 else 0
               end
           )                                     as turn_deb_rub,
           -- VAL debet turnover converted
           sum(case 
                 when cur.currency_code not in ('643', '810')
                 then at.debet_amount_rub
                 else 0
               end
           )                                     as turn_deb_val,
           -- SUM = RUB debet turnover + VAL debet turnover converted
           sum(at.debet_amount_rub)              as turn_deb_total,
           -- RUB credit turnover
           sum(case 
                 when cur.currency_code in ('643', '810')
                 then at.credit_amount_rub
                 else 0
               end
              )                                  as turn_cre_rub,
           -- VAL credit turnover converted
           sum(case 
                 when cur.currency_code not in ('643', '810')
                 then at.credit_amount_rub
                 else 0
               end
              )                                  as turn_cre_val,
           -- SUM = RUB credit turnover + VAL credit turnover converted
           sum(at.credit_amount_rub)             as turn_cre_total,
           
           sum( case 
                 when cur.currency_code     in ('643','810') and acc_d.char_type = 'A'
                 then
                       sum(case 
                              when cur.currency_code in ('643', '810')
                              then b.balance_out
                              else 0
                             end
                          ) -
                       sum(case 
                             when cur.currency_code in ('643', '810')
                             then at.credit_amount_rub
                             else 0
                           end
                          ) +
                       sum(case 
                             when cur.currency_code in ('643', '810')
                             then at.debet_amount_rub
                             else 0
                           end
                       )
                 
                 when cur.currency_code     in ('643','810') and acc_d.char_type = 'P'
                 then 
                        sum(case 
                              when cur.currency_code in ('643', '810')
                              then b.balance_out
                              else 0
                             end
                          ) +
                       sum(case 
                             when cur.currency_code in ('643', '810')
                             then at.credit_amount_rub
                             else 0
                           end
                          ) -
                       sum(case 
                             when cur.currency_code in ('643', '810')
                             then at.debet_amount_rub
                             else 0
                           end
                       )

                 else 0
                end
             )                                                          as balance_out_rub,
             
             
          sum(  case 
                 when cur.currency_code not in ('643', '810') and acc_d.char_type = 'A'
                 then
                 
                      sum(  case 
                             when cur.currency_code not in ('643', '810')
                             then b.balance_out * exch_r.reduced_cource
                             else 0
                            end
                         ) -
                      sum(  case 
                             when cur.currency_code not in ('643', '810')
                             then at.credit_amount_rub
                             else 0
                           end
                         ) + 
                      sum(  case 
                             when cur.currency_code not in ('643', '810')
                             then at.debet_amount_rub
                             else 0
                           end
                         )
                 
                 when cur.currency_code not in ('643', '810') and acc_d.char_type = 'P'
                 then 
                      sum(  case 
                             when cur.currency_code not in ('643', '810')
                             then b.balance_out * exch_r.reduced_cource
                             else 0
                            end
                         )+ 
                      sum(  case 
                             when cur.currency_code not in ('643', '810')
                             then at.credit_amount_rub
                             else 0
                           end
                         )- 
                      sum(  case 
                             when cur.currency_code not in ('643', '810')
                             then at.debet_amount_rub
                             else 0
                           end
                         )
                 else 0
               end
             )                                                as balance_out_val,
             cast(null as number)                             as balance_out_total 
      from ds.md_ledger_account_s s
      join ds.md_account_d acc_d
        on substr(acc_d.account_number, 1, 5) = s.ledger_account
      join ds.md_currency_d cur
        on cur.currency_rk = acc_d.currency_rk
      left 
      join ds.ft_balance_f b
        on b.account_rk = acc_d.account_rk
       and b.on_date  = trunc(i_OnDate, 'mm') - 1
      left 
      join ds.md_exchange_rate_d exch_r
        on exch_r.currency_rk = acc_d.currency_rk
       and i_OnDate between exch_r.data_actual_date and exch_r.data_actual_end_date
      left 
      join dma.dm_account_turnover_f at
        on at.account_rk = acc_d.account_rk
       and at.on_date between trunc(i_OnDate, 'mm') and last_day(i_Ondate)
     where i_OnDate between s.start_date and s.end_date
       and i_OnDate between acc_d.data_actual_date and acc_d.data_actual_end_date
       and i_OnDate between cur.data_actual_date and cur.data_actual_end_date
    group by
       trunc(i_OnDate, 'mm'),
       last_day(i_OnDate),
       s.chapter,
       substr(acc_d.account_number, 1, 5),
       acc_d.char_type;
    update dm_f101_round_f f set
           f.balance_out_total = f.balance_out_val  + f.balance_out_rub;

    Log('[END] inserted ' || to_char(sql%rowcount) || ' rows.');

    commit;
    
  end;
  ----------------------------------------------------------------------------------------------------

end fill_f101_round_f;
/```




Solution

  • All non-aggregated columns must be contained in group by clause, not only some of them.

    Currently, this is select

     select      
           trunc(i_OnDate, 'mm')                 as from_date,
           last_day(i_OnDate)                    as to_date,
           s.chapter                             as chapter,
           substr(acc_d.account_number, 1, 5)    as ledger_account,
           acc_d.char_type                       as characteristic
           
    

    and this is group by:

     group by 
           s.chapter,
           substr(acc_d.account_number, 1, 5),
           acc_d.char_type
           
    

    Should've been

     group by
           trunc(i_OnDate, 'mm'),
           last_day(i_OnDate),
           s.chapter,
           substr(acc_d.account_number, 1, 5),
           acc_d.char_type