Как рассчитать общее количество записей после группировки на основе определенного столбца

#sql #oracle #group-by

#sql #Oracle #группировать по

Вопрос:

Требование

Прикрепленный запрос:

     select abc.acc_entry_status account_status,count(abc.acc_entry_status) count from (
    select xlasl.application_short_name short_name, 
           xlasl.application_name source,
           to_char(xtl.transaction_date,'YYYY-MM-DD') trans_date,
           xth.char1 event_type,
           xtl.application_id application_id, 
           xtl.event_id event_id, 
           xtl.line_number line_number,
           xth.transaction_number transaction_number,
           to_char(xth.creation_date,'YYYY-MM-DD') creation_date,
           aeh.gl_transfer_status_code gl_transfer_status,
           aeh.ACCOUNTING_ENTRY_STATUS_CODE acc_entry_status, 
            to_char(aeh.gl_transfer_date,'YYYY-MM-DD') gl_transfer_date,
           aeh.period_name period_name
    from xla_transaction_headers xth, 
         xla_transaction_lines xtl, 
         xla_ae_headers aeh,
         xla_subledgers_vl xlasl
    where xth.application_id=xtl.application_id
        and xth.event_id=xtl.event_id
        and xth.event_id=aeh.event_id
        and xlasl.application_id=xth.application_id
        and xlasl.application_type_code='C'
            and aeh.parent_ae_header_id is null
        and xlasl.application_name=:p_source
        and trunc(xth.creation_date)=to_date(Substr(:p_creation_date,1,10),'YYYY-MM-DD'))  abc
    group by acc_entry_status
  

`

Ответ №1:

Никогда не используйте запятые в FROM предложении. Всегда используйте правильный, явный, стандартный, читаемый JOIN синтаксис. Вы должны исправить этот запрос и изучить правильный синтаксис SQL для ваших будущих запросов.

Вы можете использовать условную агрегацию:

 with q as (
      <your query here, hopefully fixed to use proper syntax
     )
select sum(case when account_status = 'I' then count else 0 end) as Invalid,
       sum(case when account_status = 'F' then count else 0 end) as Failed,
       sum(count) as total   
from q
where account_status in ('I', 'F')
  

Комментарии:

1. Запрос, скорее всего, был сгенерирован автоматически каким-либо приложением, вероятно, принадлежащим самому Oracle. Приложение использует синтаксис соединения Oracle, а не наш OP в этом потоке. (Я точно знаю, что PeopleSoft ведет себя именно так.) Сражайтесь с Oracle и другими поставщиками приложений, а не с OP.