Erro Consulto SQL Não consigo somar dois campos de subconsulta
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
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
Curtidas 0
Respostas
Emerson Nascimento
17/06/2022
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?
tem certeza que as subconsultas são necessárias?
do que exatamente você precisa?
GOSTEI 0
Rafael Natel
17/06/2022
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))
;
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))
;
GOSTEI 0
Rafael Natel
17/06/2022
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
;
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
;
GOSTEI 0
Rafael Natel
17/06/2022
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
;
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
;
GOSTEI 0