como faço para buscar a última data e a data mais próxima de um valor

12/04/2019

9

alguém pode me ajudar, eu tenho as seguintes tabelas de entrada e saidas

table_ent | table_out
cod_prod date_ent vl_prod | cod_prod date_out vl_prod
362 14/09/2015 100,00 | 362 01/10/2016 700,00
362 15/09/2015 150,00 | 362 07/10/2016 800,00
362 16/09/2015 10,00 | 362 29/10/2016 100,00
362 05/10/2016 20,00 | 362 01/10/2016 800,00
362 06/10/2016 300,00 |
362 07/10/2016 460,00 |
362 08/10/2016 510,00 |
362 23/10/2016 620,00 |
362 24/10/2016 750,00 |
362 25/10/2016 810,00 |
362 30/10/2019 920,00 |

Estou usando um inner join com a max(data) de entrada porém retorna os valores com duplicidades

cod_ent date_out vl_ent cod_ent vl_ent date_ent
------ -------- ------ --- --- -------
362 01/10/16 700 362 100 14/09/15
362 01/10/16 800 362 10 16/09/15
362 01/10/16 700 362 150 15/09/15
362 01/10/16 700 362 10 16/09/15
362 01/10/16 800 362 150 15/09/15
362 01/10/16 800 362 100 14/09/15
362 07/10/16 100 362 20 05/10/16
362 07/10/16 100 362 300 06/10/16
362 07/10/16 100 362 100 14/09/15
362 07/10/16 100 362 10 16/09/15
362 07/10/16 100 362 150 15/09/15
362 29/10/16 920 362 510 08/10/16
362 29/10/16 920 362 750 24/10/16
362 29/10/16 920 362 460 07/10/16
362 29/10/16 920 362 10 16/09/15

O resultado esperado seria esse:

cod_ent date_out vl_ent cod_ent vl_ent date_ent
------ -------- ------ --- ----- --------------
362 01/10/16 700 362 100 14/09/15
362 01/10/16 800 362 10 16/09/15
362 07/10/16 100 362 20 06/10/16
362 29/10/16 920 362 750 25/10/16
Responder

Posts

12/04/2019

Chromusmaster

Poderia disponibilizar a consulta para podermos ajudar melhor?
Responder

12/04/2019

Alex

Poderia disponibilizar a consulta para podermos ajudar melhor?

select a.cod_prod, a.date_out, a.vl_prod, sum(b.cod_prod) as cod_prod, sum(b.vl_prod) vl_prod, max(b.date_ent) as date_ent
from table_out a
join table_ent b on b.cod_prod = a.cod_prod and b.date_ent < a.date_out
group by a.cod_prod, a.date_out, b.cod_prod, a.vl_prod, b.vl_prod
order by a.cod_prod, a.date_out;
Responder

12/04/2019

Alex

Poderia disponibilizar a consulta para podermos ajudar melhor?

os valores vêm duplicados, precisava apenas trazer a "última entrada mais próxima" da data de saida uma única vez

Responder
select
	a.cod_prod, a.date_out, a.vl_prod, sum(b.vl_prod) vl_prod_ent, max(b.date_ent) as date_ent
from
	table_out a
join
	table_ent b on b.cod_prod = a.cod_prod and b.date_ent < a.date_out
group by
	a.cod_prod, a.date_out, a.vl_prod
order by
	a.cod_prod, a.date_out

somente retirei os campos desnecessários do group by.
Responder

12/04/2019

Alex

Más preciso dos valores que estão na entrada junto com a data de entrada também igual ao que coloquei no resultado esperado
Responder

12/04/2019

Alex

corrigindo preciso obter esse resultado

cod_ent--------date_out-------vl_ent----cod_ent-------vl_ent----- date_ent
362---------------01/10/16------700-------362-------------10------------16/09/15
362---------------01/10/16------800-------362-------------10------------16/09/15
362---------------07/10/16------100-------362------------300-----------06/10/16
362---------------29/10/16------920-------362-------------750----------25/10/16
Responder
tente algo assim:
select a.cod_prod, a.date_out, a.vl_out, a.date_ent, sum(b.vl_prod) vl_ent
from
(
select
    a.cod_prod, a.date_out, a.vl_prod vl_out, max(b.date_ent) as date_ent
from
    table_out a
join
    table_ent b on b.cod_prod = a.cod_prod and b.date_ent < a.date_out
group by
    a.cod_prod, a.date_out, a.vl_prod
) a
join
    table_ent b on b.cod_prod = a.cod_prod and b.date_ent = a.date_ent
group by
    a.cod_prod, a.date_out, a.vl_out, a.date_ent
order by
    a.cod_prod, a.date_out

O resultado foi:
COD_PROD	DATE_OUT	VL_OUT		VL_ENT	DATE_ENT
362			01.10.2016	700			10		16.09.2015
362			01.10.2016	800			10		16.09.2015
362			07.10.2016	800			300		06.10.2016
362			29.10.2016	100			810		25.10.2016

Responder

16/04/2019

Alex

Obrigado Emerson me ajudou muito deu certo aqui !!!
Responder