Erro Consulto SQL Não consigo somar dois campos de subconsulta

17/06/2022

9

Bom dia!

Este é meu primeiro tópico no fórum então peço desculpas por qualquer deslize.

Estou tendo problema em uma consulta sql, onde não estou conseguindo realizar a soma de dois campos que estou retornando em uma subquery. Se alguém puder me dar um auxilio ficaria muito grato.
Segue a consulta:

select
n.id_geral,
n2.id_geral,
n.dcto_numero,
i.cd_item,
(
select
cast ((n3.ipi_valor / n3.qt_estoque) as money) as vl_ipi
from
nfi n3
join nfc n4 on n4.id_geral = n3.id_nfc
where
n3.id_item = n2.id_item
and n4.fl_entrada_saida = ''E''
and n4.cd_operacao = 240
and n4.cd_filial = :filial
order by
n3.id_nfc desc limit (1)
) as ipi,

(
select
cast ((n5.rateado_vl_frete_conhec / n5.qt_estoque ) as money) as vl_frete
from
nfi n5
join nfc n6 on n6.id_geral = n5.id_nfc
where
n5.id_item = n2.id_item
and n6.fl_entrada_saida = ''E''
and n6.cd_operacao = 240
and n6.cd_filial = :filial
order by
n5.id_nfc desc limit (1)
) as vl_frete,

cast ((
select
custo_gerencial_medio
from
func_custo_item_dia
(n2.id_item,CURRENT_DATE,n.cd_filial)
) as money) as custo_gerencial_medio

from
nfc n
join nfi n2 on n2.id_nfc = n.id_geral
join item i on i.id_item = n2.id_item
where
((n.dcto_numero = :nr_nf) or (:nr_nf = 0))
and n.fl_entrada_saida = ''E''
and ((n.cd_clifor = :fornecedor) or (:fornecedor = 0))
;

Eu preciso somar os campos custo_gerencial_medio + ipi + vl_frete, e o que está me retornando é que o campo ''ipi'' não existe devido ao fato de ele vir de uma subquery.
Estou usando essa linha de comando:

((select custo_gerencial_medio from func_custo_item_dia (n2.id_item,CURRENT_DATE,n.cd_filial)) + vl_frete + ipi) as custo_atualizado

e me retorna o seguinte erro

SQL Error [42703]: ERROR: column "ipi" does not exist
Position: 1093
Rafael Natel

Rafael Natel

Responder

Posts

17/06/2022

Emerson Nascimento

nas subconsultas para montar o conteúdo de IPI e VL_FRETE você usa as mesmas tabelas utilizadas na instrução principal.
tem certeza que as subconsultas são necessárias?

do que exatamente você precisa?
Responder

17/06/2022

Rafael Natel

Boa Tarde Emerson!

Vou descrever a situação para me explicar.

Essa consulta está trazendo as informações da nota de transferência de uma filial para outra, onde está elencando os itens da nota que foram transferidos, o que eu preciso é verificar a ultima nota de entrada do fornecedor de cada um dos itens e trazer o valor de ipi e do frete para que eu possa atualizar o custo deste produto na filial após a transferência.
por isso a subquery na mesma tabela, por join eu sei que daria certo mas não consegui estruturar o Join, vou colar ele aqui, estou precisando de ideias e do jeito que for agradeço.

select
n.id_geral,
n2.id_geral,
n.dcto_numero,
i.cd_item,
nfi_ultima.vl_ipi,
nfi_ultima.vl_frete,
cast ((
select
custo_gerencial_medio
from
func_custo_item_dia
(n2.id_item,CURRENT_DATE,n.cd_filial)
) as money) as custo_gerencial_medio

from
nfc n
join nfi n2 on n2.id_nfc = n.id_geral
join item i on i.id_item = n2.id_item
join
(
select
cast ((n3.ipi_valor / n3.qt_estoque) as money) as vl_ipi,
cast ((n3.rateado_vl_frete_conhec / n3.qt_estoque) as money) as vl_frete,
n3.id_item
from
nfi n3
join nfc n4 on n4.id_geral = n3.id_nfc
where
n4.fl_entrada_saida = 'E'
and n4.cd_operacao in (240)
order by
n3.id_nfc desc limit (1)
) as nfi_ultima on n2.id_item = nfi_ultima.id_item
where
((n.dcto_numero = :nr_nf) or (:nr_nf = 0))
and n.fl_entrada_saida = 'E'
and ((n.cd_clifor = :fornecedor) or (:fornecedor = 0))
;

Responder

17/06/2022

Rafael Natel

Consegui estruturar o Join na consulta, agora só preciso fazer com que me retorne apenas o ultimo registro, porque está me trazendo todos os registros de cada item:

select
n.id_geral,
n2.id_geral,
n.dcto_numero,
i.id_item,
i.cd_item,
nfi_ultima.id_geral,
nfi_ultima.vl_ipi,
nfi_ultima.vl_frete,
cast (( select custo_gerencial_medio from func_custo_item_dia (n2.id_item,CURRENT_DATE,n.cd_filial)) as money) as custo_gerencial_medio,
sum ( cast (( select custo_gerencial_medio from func_custo_item_dia (n2.id_item,CURRENT_DATE,n.cd_filial)) as money) + nfi_ultima.vl_frete + nfi_ultima.vl_ipi) as custo_atualizado
from
nfc n
join nfi n2 on n2.id_nfc = n.id_geral
join item i on i.id_item = n2.id_item
join
(
select
cast ((n3.ipi_valor / n3.qt_estoque) as money) as vl_ipi,
cast ((n3.rateado_vl_frete_conhec / n3.qt_estoque) as money) as vl_frete,
n3.id_item,
n3.id_geral
from
nfi n3
join nfc n4 on n4.id_geral = n3.id_nfc
where
n4.fl_entrada_saida = 'E'
and n4.cd_operacao in (240)
order by
n3.id_geral desc
) as nfi_ultima on n2.id_item = nfi_ultima.id_item
where
((n.dcto_numero = :nr_nf) or (:nr_nf = 0))
and n.fl_entrada_saida = 'E'
and ((n.cd_clifor = :fornecedor) or (:fornecedor = 0))
and n2.id_item = 3360

group by
n.id_geral,
n2.id_geral,
n.dcto_numero,
i.id_item,
i.cd_item,
nfi_ultima.id_geral,
nfi_ultima.vl_ipi,
nfi_ultima.vl_frete
;
Responder

21/06/2022

Rafael Natel

Consegui resolver com o row_number e o partition by

select
n.id_geral,
n2.id_geral,
n.dcto_numero,
i.id_item,
i.cd_item,
nfi_ultima.id_geral,
nfi_ultima.vl_ipi,
nfi_ultima.vl_frete,
cast (( select custo_gerencial_medio from func_custo_item_dia (n2.id_item,CURRENT_DATE,n.cd_filial)) as money) as custo_gerencial_medio,
sum ( cast (( select custo_gerencial_medio from func_custo_item_dia (n2.id_item,CURRENT_DATE,n.cd_filial)) as money) + nfi_ultima.vl_frete + nfi_ultima.vl_ipi) as custo_atualizado
from
nfc n
join nfi n2 on n2.id_nfc = n.id_geral
join item i on i.id_item = n2.id_item
join
(
select
cast ((n3.ipi_valor / n3.qt_estoque) as money) as vl_ipi,
cast ((n3.rateado_vl_frete_conhec / n3.qt_estoque) as money) as vl_frete,
row_number() over (partition by n3.id_item order by n4.id_geral desc ) item_ordem,
n3.id_item,
n3.id_geral,
n4.dt_emissao
from
nfi n3
join nfc n4 on n4.id_geral = n3.id_nfc
where
n4.fl_entrada_saida = ''E''
and n4.cd_operacao in (240)
) as nfi_ultima on n2.id_item = nfi_ultima.id_item and nfi_ultima.item_ordem = 1
where
((n.dcto_numero = :nr_nf) or (:nr_nf = 0))
and n.fl_entrada_saida = ''E''
and ((n.cd_clifor = :fornecedor) or (:fornecedor = 0))
-- and n2.id_item = 3360
group by
n.id_geral,
n2.id_geral,
n.dcto_numero,
i.id_item,
i.cd_item,
nfi_ultima.id_geral,
nfi_ultima.vl_ipi,
nfi_ultima.vl_frete
;
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários,
consulte nossa política de privacidade.

Aceitar