Доступ к вложенному выбору в списке полей

#sql #oracle #oracle-sqldeveloper

#sql #Oracle #oracle-sqldeveloper

Вопрос:

Мне был предоставлен запрос для поиска некоторых данных в базе данных, который выглядит следующим образом:

 select nvl(to_char(a.empresa), 'SEM REMESSA') empresa,
      c.conta,
       nvl(sum(a.valor_total), 0) as folha,
       (select count(distinct(l2.creditado))
          from lancamentos l2
         inner join vw_arquivos a2
            on l2.arquivo = a2.arquivo
         where a2.empresa = a.empresa) as funcionarios
  from conta_table c
  left join vw_arquivos a
    on c.conta = a.conta
   and a.situacao = 6
  group by a.empresa, c.conta
  

Я должен получить значение операции folha / funcionarios , но если я помещу это в список полей, я получу ошибку:

 ORA-00904: "FUNCIONARIOS": invalid identifier
00904. 00000 -  "%s: invalid identifier"
  

И когда я заменяю свою ссылку на funcionarios тем же вложенным выбором, я получаю ту же ошибку при ссылке folha .

Я знаю, что мог бы просто заменить обе ссылки их соответствующими вычислениями, и это работает. Вот так:

 nvl(sum(a.valor_total), 0) / 
(select count(distinct(l2.creditado))
          from lancamentos l2
         inner join vw_arquivos a2
            on l2.arquivo = a2.arquivo
         where a2.empresa = a.empresa) as division
  

Но это выглядит не так оптимизировано и не похоже на лучший способ сделать это. Итак, мой вопрос…
Есть ли какой-либо способ выбрать эти значения с помощью этой последней операции деления, но более оптимизированный, чем повторение вычислений folha и funcionarios ? Возможно, способ ссылаться на эти уже вычисленные значения.

Ответ №1:

folha на и funcionarios нельзя ссылаться в одном запросе, поскольку они являются псевдонимами. Вы должны выполнить весь запрос в виде подзапроса и получить разделение, вот так:

 select empresa, conta, folha/funcionarios folha_div_funcionarios
from (
  select nvl(to_char(a.empresa), 'SEM REMESSA') empresa,
        c.conta,
         nvl(sum(a.valor_total), 0) as folha,
         (select count(distinct(l2.creditado))
            from lancamentos l2
           inner join vw_arquivos a2
              on l2.arquivo = a2.arquivo
           where a2.empresa = a.empresa) as funcionarios
    from conta_table c
    left join vw_arquivos a
      on c.conta = a.conta
     and a.situacao = 6
    group by a.empresa, c.conta
)