Oracle/ SQL - Retornar Dados em Meses não encontrados

20/08/2019

0

Prezados, bom dia,

Estou elaborando uma querie para trazer o valor de custo de determinado produto. Tenho uma tabela que armazena o custo mensal do produto. Quando o usuário insere um mês que tem dado inserido nesta tabela o relatório gera perfeito. O problema é quando ele insere um mês que não tem valor de custo armazenado. Eu gostaria de trazer o primeiro mês anterior ao que ele digitar. Exemplo digitou maio e não encontrou, verifica abril se tem, se não tiver, março, e assim por diante até encontrar o primeiro mes anterior que possua a informação. Segue abaixo o script:

SELECT
CD_CUSTO_MEDIO_MENSAL,
TO_CHAR(custo_medio.dh_custo_medio,''MM/YYYY'') AS DATA,
Custo_medio.cd_produto as cd_produto,
Custo_medio.vl_custo_medio * verif_vl_fator_prod(produto.cd_produto) as vl_custo_medio,
dbamv.VERIF_DS_UNID_PROD(produto.cd_produto) ds_unidade
FROM Dbamv.custo_medio_mensal Custo_medio,Dbamv.produto Produto
WHERE Custo_medio.cd_produto = Produto.cd_produto
-- AND TO_CHAR(custo_medio.dh_custo_medio,''MM/YYYY'')= ''05/2019'' -- O usuário vai digitar o mês em um relatório
AND Custo_medio.cd_produto = 21602 -- o usuário irá digitar o produto em um relatório
ORDER BY 1 DESC
;

Abaixo segue a saída.

1112481 04/2019 21602 0,44363713 UNIDADE
1079548 03/2019 21602 0,4292843 UNIDADE
1053181 02/2019 21602 0,42712296 UNIDADE
1024905 01/2019 21602 0,42477557 UNIDADE
1010639 12/2018 21602 0,40686819 UNIDADE
984718 11/2018 21602 0,40094618 UNIDADE
954341 09/2018 21602 0,36798646 UNIDADE
948329 08/2018 21602 0,36978872 UNIDADE
916969 07/2018 21602 0,37332161 UNIDADE
891914 06/2018 21602 0,37631193 UNIDADE
858469 05/2018 21602 0,40991828 UNIDADE
796210 03/2018 21602 0,42936174 UNIDADE
644659 09/2017 21602 0,42864729 UNIDADE

Neste exemplo se ele digitar Abril vai trazer corretamente o valor 0,44363713. Porém se ele digitar Outubro de 2018 o sistema não encontrará e deveria trazer o valor de Setembro de 2018, ou seja, 0,36798646.
Ricardo Rodrigues

Ricardo Rodrigues

Responder

Post mais votado

20/08/2019

deve ser algo assim:
SELECT 
	cm.CD_CUSTO_MEDIO_MENSAL,
	TO_CHAR(cm.dh_custo_medio,'MM/YYYY') AS DATA,
	cm.cd_produto,
	cm.vl_custo_medio * verif_vl_fator_prod(p.cd_produto) as vl_custo_medio,
	dbamv.VERIF_DS_UNID_PROD(p.cd_produto) ds_unidade
FROM
	Dbamv.custo_medio_mensal cm
INNER JOIN
	Dbamv.produto p ON p.cd_produto = cm.cd_produto
WHERE
	cm.cd_produto = 21602 -- o usuário irá digitar o produto em um relatório
	and TO_CHAR(cm.dh_custo_medio,'MM/YYYY') =
		(	SELECT MAX(TO_CHAR(cm.dh_custo_medio,'MM/YYYY'))
			FROM Dbamv.custo_medio_mensal cm2
			WHERE cm2.cd_produto = cm.cd_produto
				AND TO_CHAR(cm2.dh_custo_medio,'MM/YYYY') <= '05/2019' -- O usuário vai digitar o mês em um relatório
		)
ORDER BY
	1 DESC

Emerson Nascimento

Emerson Nascimento
Responder

Mais Posts

20/08/2019

Ricardo Rodrigues

Emerson, boa tarde.

Acabou que replicou as linhas não trouxe apenas 1 resultado. Ou traz do mês ou traz o primeiro que encontrar. O resultado ficou assim:
1209370 08/2019 21602 0,43290218 UNIDADE
1202875 07/2019 21602 0,43345197 UNIDADE
1163015 06/2019 21602 0,43460449 UNIDADE
1138140 05/2019 21602 0,43803387 UNIDADE
1112481 04/2019 21602 0,44363713 UNIDADE
1079548 03/2019 21602 0,4292843 UNIDADE
1053181 02/2019 21602 0,42712296 UNIDADE
1024905 01/2019 21602 0,42477557 UNIDADE
1010639 12/2018 21602 0,40686819 UNIDADE
984718 11/2018 21602 0,40094618 UNIDADE
954341 09/2018 21602 0,36798646 UNIDADE
948329 08/2018 21602 0,36978872 UNIDADE
916969 07/2018 21602 0,37332161 UNIDADE
891914 06/2018 21602 0,37631193 UNIDADE
858469 05/2018 21602 0,40991828 UNIDADE
796210 03/2018 21602 0,42936174 UNIDADE
644659 09/2017 21602 0,42864729 UNIDADE
631359 08/2017 21602 0,42845199 UNIDADE
616274 07/2017 21602 0,42730099 UNIDADE
565283 06/2017 21602 0,4334427 UNIDADE
525178 05/2017 21602 0,43871053 UNIDADE
495546 04/2017 21602 0,46081025 UNIDADE
423905 02/2017 21602 0,47016057 UNIDADE
395907 01/2017 21602 0,47666245 UNIDADE
324293 11/2016 21602 0,44329683 UNIDADE
287442 10/2016 21602 0,45180808 UNIDADE
241604 08/2016 21602 0,46117003 UNIDADE
226188 07/2016 21602 0,42745508 UNIDADE
187754 06/2016 21602 0,40715569 UNIDADE
144177 05/2016 21602 0,37862274 UNIDADE
121502 04/2016 21602 0,32908746 UNIDADE
104477 03/2016 21602 0,36645838 UNIDADE
74476 02/2016 21602 0,30289855 UNIDADE
52787 11/2015 21602 0,30154839 UNIDADE
50394 10/2015 21602 0,30346946 UNIDADE
46652 09/2015 21602 0,30773917 UNIDADE
41315 08/2015 21602 0,32366865 UNIDADE
39736 07/2015 21602 0,32367911 UNIDADE
29278 05/2015 21602 0,32615604 UNIDADE
27883 04/2015 21602 0,29737816 UNIDADE
26086 03/2015 21602 0,27982585 UNIDADE
23368 02/2015 21602 0,26842244 UNIDADE
143 09/2014 21602 0,253 UNIDADE

deve ser algo assim:
SELECT 
	cm.CD_CUSTO_MEDIO_MENSAL,
	TO_CHAR(cm.dh_custo_medio,'MM/YYYY') AS DATA,
	cm.cd_produto,
	cm.vl_custo_medio * verif_vl_fator_prod(p.cd_produto) as vl_custo_medio,
	dbamv.VERIF_DS_UNID_PROD(p.cd_produto) ds_unidade
FROM
	Dbamv.custo_medio_mensal cm
INNER JOIN
	Dbamv.produto p ON p.cd_produto = cm.cd_produto
WHERE
	cm.cd_produto = 21602 -- o usuário irá digitar o produto em um relatório
	and TO_CHAR(cm.dh_custo_medio,'MM/YYYY') =
		(	SELECT MAX(TO_CHAR(cm.dh_custo_medio,'MM/YYYY'))
			FROM Dbamv.custo_medio_mensal cm2
			WHERE cm2.cd_produto = cm.cd_produto
				AND TO_CHAR(cm2.dh_custo_medio,'MM/YYYY') <= '05/2019' -- O usuário vai digitar o mês em um relatório
		)
ORDER BY
	1 DESC
Responder

20/08/2019

Emerson Nascimento

tinha um erro na instrução:
SELECT
    cm.CD_CUSTO_MEDIO_MENSAL,
    TO_CHAR(cm.dh_custo_medio,'MM/YYYY') AS DATA,
    cm.cd_produto,
    cm.vl_custo_medio * verif_vl_fator_prod(p.cd_produto) as vl_custo_medio,
    dbamv.VERIF_DS_UNID_PROD(p.cd_produto) ds_unidade
FROM
    Dbamv.custo_medio_mensal cm
INNER JOIN
    Dbamv.produto p ON p.cd_produto = cm.cd_produto
WHERE
    cm.cd_produto = 21602 -- o usuário irá digitar o produto em um relatório
    and TO_CHAR(cm.dh_custo_medio,'MM/YYYY') =
        (   SELECT MAX(TO_CHAR(cm2.dh_custo_medio,'MM/YYYY')) -- aqui estava cm.dh_custo_medio
            FROM Dbamv.custo_medio_mensal cm2
            WHERE cm2.cd_produto = cm.cd_produto
                AND TO_CHAR(cm2.dh_custo_medio,'MM/YYYY') <= '05/2019' -- O usuário vai digitar o mês em um relatório
        )
ORDER BY
    1 DESC
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

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

Aceitar