#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
)