Otimizar consulta no Progress
20/01/2015
0
Estou tentando fazer uma consulta num banco de dados de minha empresa.
Porém, a consulta levou em torno de 40 minutos para ser concluída. Para retornar apenas um resultado.
Minha consulta é em cima das frotas da empresa, sendo assim, eu planejo ter um resultado para cada frota, fiz um teste ontem apenas com uma, e já levou todo esse tempo, imagine quando eu colocar para percorrer por todas :z.
O meu select é o seguinte:
output to "C:/Relatorio de Preventivas.txt".
select mmv-ord-manut.cod-eqpto,
max(mmv-ord-manut.dat-abert),
mmv-tar-ord-manut.nr-ord-produ,
mmv-ord-manut.val-hodom-horim,
mmv-tar-ord-manut.cod-evento,
max(mab-movto-km-eqpto.val-km-real),
mab-period-manut.val-km-padr
from mmv-ord-manut
inner join mmv-tar-ord-manut
on mmv-ord-manut.nr-ord-produ = mmv-tar-ord-manut.nr-ord-produ
inner join mab-movto-km-eqpto
on mmv-ord-manut.cod-eqpto = mab-movto-km-eqpto.cod-eqpto
inner join mab-period-manut
on mab-period-manut.cod-eqpto = mab-movto-km-eqpto.cod-eqpto
where mmv-ord-manut.cod-eqpto = "542" and
mmv-tar-ord-manut.cod-evento = "103" and
mab-movto-km-eqpto.cod-eqpto = "542"
group by mmv-ord-manut.cod-eqpto
with width 600.
output close.
Obs: O banco de dados que estou usando é o Progress OpenEdge 10.1A
Fernando Batista
Post mais votado
20/01/2015
A cláusula GROUP BY não deve conter todos os campos informados no SELECT, exceto o campo "mab-movto-km-eqpto.val-km-real" que está seno utilizado com a função MAX?
group by mmv-ord-manut.cod-eqpto, max(mmv-ord-manut.dat-abert), mmv-tar-ord-manut.nr-ord-produ, mmv-ord-manut.val-hodom-horim, mmv-tar-ord-manut.cod-evento, mab-period-manut.val-km-padr
Marisiana Battistella
Mais Posts
20/01/2015
Fernando Batista
Obrigado pela ajuda!
20/01/2015
Marisiana Battistella
Remove a linha "max(mmv-ord-manut.dat-abert)," do GROUP BY...
20/01/2015
Fernando Batista
Eqpto------------ MAX---------- -------Ordem-------Contador- Evento------ -----------MAX- --------PadrÆo-
542 31/07/2012 300.344 0,0 103 289.370,1 15.000,0
542 09/06/2013 304.365 210.278,1 103 289.370,1 15.000,0
542 21/06/2013 304.405 213.500,0 103 289.370,1 15.000,0
542 28/06/2013 304.697 0,0 103 289.370,1 15.000,0
542 19/08/2013 305.726 222.731,3 103 289.370,1 15.000,0
542 02/09/2013 306.039 230.005,0 103 289.370,1 15.000,0
542 16/11/2013 307.492 279.623,2 103 289.370,1 15.000,0
542 28/11/2013 307.749 0,0 103 289.370,1 15.000,0
542 16/12/2013 308.114 238.620,0 103 289.370,1 15.000,0
542 17/03/2014 308.789 0,0 103 289.370,1 15.000,0
542 18/04/2014 309.276 0,0 103 289.370,1 15.000,0
542 03/06/2014 310.162 0,0 103 289.370,1 15.000,0
542 10/07/2014 310.576 0,0 103 289.370,1 15.000,0
No caso, antes eu tinha apenas o último elemento (com data 10/07/14).
20/01/2015
Fernando Batista
output to "C:/Relat½rio de Preventivas.txt".
select mmv-ord-manut.cod-eqpto,
max(mmv-ord-manut.dat-abert),
mmv-tar-ord-manut.nr-ord-produ,
mmv-ord-manut.val-hodom-horim,
mmv-tar-ord-manut.cod-evento,
max(mab-movto-km-eqpto.val-km-real),
mab-period-manut.val-km-padr
from mmv-ord-manut
inner join mmv-tar-ord-manut
on mmv-ord-manut.nr-ord-produ = mmv-tar-ord-manut.nr-ord-produ
inner join mab-movto-km-eqpto
on mmv-ord-manut.cod-eqpto = mab-movto-km-eqpto.cod-eqpto
inner join mab-period-manut
on mab-period-manut.cod-eqpto = mab-movto-km-eqpto.cod-eqpto
where mmv-ord-manut.cod-eqpto = "542" and
mmv-tar-ord-manut.cod-evento = "103" and
mab-movto-km-eqpto.cod-eqpto = "542"
group by mmv-ord-manut.cod-eqpto,
mmv-tar-ord-manut.nr-ord-produ,
mmv-ord-manut.val-hodom-horim,
mmv-tar-ord-manut.cod-evento,
mab-period-manut.val-km-padr
with width 600.
output close.
20/01/2015
Marisiana Battistella
20/01/2015
Marisiana Battistella
output to "C:/Relat½rio de Preventivas.txt". select mmv-ord-manut.cod-eqpto, mmv-ord-manut.dat-abert, mmv-tar-ord-manut.nr-ord-produ, mmv-ord-manut.val-hodom-horim, mmv-tar-ord-manut.cod-evento, max(mab-movto-km-eqpto.val-km-real), mab-period-manut.val-km-padr from mmv-ord-manut inner join mmv-tar-ord-manut on mmv-ord-manut.nr-ord-produ = mmv-tar-ord-manut.nr-ord-produ inner join mab-movto-km-eqpto on mmv-ord-manut.cod-eqpto = mab-movto-km-eqpto.cod-eqpto inner join mab-period-manut on mab-period-manut.cod-eqpto = mab-movto-km-eqpto.cod-eqpto where mmv-ord-manut.cod-eqpto = "542" and mmv-tar-ord-manut.cod-evento = "103" and mmv-ord-manut.dat-abert = (select max(mom.dat-abert) from mmv-ord-manut mom inner join mmv-tar-ord-manut mtom on mom.nr-ord-produ = mtom.nr-ord-produ where mom.cod-eqpto = "542" and mtom.cod-evento = "103") group by mmv-ord-manut.cod-eqpto, mmv-ord-manut.dat-abert, mmv-tar-ord-manut.nr-ord-produ, mmv-ord-manut.val-hodom-horim, mmv-tar-ord-manut.cod-evento, mab-period-manut.val-km-padr with width 600. output close.
Não sei se é a melhor solução.. Eu não conheço a estrutura e os nomes das tabelas são difíceis de entender....
24/01/2015
Fernando Batista
Agora sim, a consulta traz as informações que eu quero.
Para ficar perfeito, falta um detalhe, quero que esta consulta não seja filtrada pelo mmv-ord-manut.cod-eqpto = "542", quero uma linha para cada elemento desta coluna. Tentei remover os filtros, mudar as junções, mas não consegui, retirando os filtros, eu tive o seguinte resultado:
Eqpto------------ Abertura----- -------Ordem-------Contador- Evento------ -----------MAX- --------PadrÆo-
318 19/12/2014 311.360 21.215,7 103 248.490,3 350,0
318 19/12/2014 311.360 21.215,7 103 248.490,3 1.500,0
318 19/12/2014 311.360 21.215,7 103 248.490,3 2.500,0
Como posso fazer isto dar certo? Minha query ficou assim:
output to "C:/Relat½rio de Preventivas.txt". select mmv-ord-manut.cod-eqpto, mmv-ord-manut.dat-abert, mmv-tar-ord-manut.nr-ord-produ, mmv-ord-manut.val-hodom-horim, mmv-tar-ord-manut.cod-evento, max(mab-movto-km-eqpto.val-km-real), mab-period-manut.val-km-padr from mmv-ord-manut inner join mmv-tar-ord-manut on mmv-ord-manut.nr-ord-produ = mmv-tar-ord-manut.nr-ord-produ inner join mab-movto-km-eqpto on mmv-ord-manut.cod-eqpto = mab-movto-km-eqpto.cod-eqpto inner join mab-period-manut on mab-period-manut.cod-eqpto = mab-movto-km-eqpto.cod-eqpto where mmv-tar-ord-manut.cod-evento = "103" and mmv-ord-manut.dat-abert = (select max(mom.dat-abert) from mmv-ord-manut mom inner join mmv-tar-ord-manut mtom on mom.nr-ord-produ = mtom.nr-ord-produ where mtom.cod-evento = "103") group by mmv-ord-manut.cod-eqpto, mmv-ord-manut.dat-abert, mmv-tar-ord-manut.nr-ord-produ, mmv-ord-manut.val-hodom-horim, mmv-tar-ord-manut.cod-evento, mab-period-manut.val-km-padr with width 600. output close.
Desde já, obrigado pela atenção de quem me ajudou, e me desculpem pela falta de feed.
24/01/2015
Marisiana Battistella
Não precisa remover o filtro porque senão não vai retornar os dados que vc precisa..
Pelo que entendi você quer acrescentar duas colunas, uma para cada um dos eventos (103 e 542), seria isso?
Se for isso, você pode fazer utilizando o CASE, como nesse exemplo:
select mmv-ord-manut.cod-eqpto, mmv-ord-manut.dat-abert, mmv-tar-ord-manut.nr-ord-produ, mmv-ord-manut.val-hodom-horim, CASE WHEN mmv-tar-ord-manut.cod-evento = '103' THEN --- aqui vai a informação/coluna que será mostrada nessa condição. Ex.: max(mab-movto-km-eqpto.val-km-real), END as evento_103. CASE WHEN mmv-tar-ord-manut.cod-evento = '542' THEN ---- aqui vai a informação/coluna que será mostrada nessa condição END as evento_542 max(mab-movto-km-eqpto.val-km-real), mab-period-manut.val-km-padr [...]
Precisa ver qual é a informação que será mostrada na coluna, se é um valor, uma data, etc...
27/01/2015
Fernando Batista
Depois de muito analisar e testar meu código, cheguei a raiz do meu problema.
Quando uso a sub query com o max, estou consultado o registro com a maior data, correto? O problema está aí, ele está pegando o registro com a maior data de TODAS as ordens de manutenção. O que quero na verdade, é o seguinte, quero o registro com a MAIOR data de cada EQUIPAMENTO.
Acredito que o problema esteja aí, pois quando executo o código (abaixo), ele me retorna realmente, uma ordem que foi aberta alguns dias atrás, com certeza o problema é este que eu disse. Você pode me ajudar a corrigir isto no código?
O que estou usando é este:
output to "D:/Troca de oleo_Correct2.txt". select mmv-ord-manut.cod-eqpto, mmv-ord-manut.dat-abert, mmv-ord-manut.val-hodom-horim, mmv-tar-ord-manut.cod-evento, mab-movto-km-eqpto.val-km-real, mab-period-manut.val-km-padr, mab-comptmento.des-comptmento from mmv-ord-manut inner join mmv-tar-ord-manut on mmv-ord-manut.nr-ord-produ = mmv-tar-ord-manut.nr-ord-produ inner join mab-movto-km-eqpto on mmv-ord-manut.dat-abert = mab-movto-km-eqpto.dat-movto inner join mab-period-manut on mmv-tar-ord-manut.cod-evento = mab-period-manut.cod-evento and mmv-tar-ord-manut.cod-eqpto = mab-period-manut.cod-eqpto inner join mab-comptmento on mab-comptmento.cod-comptmento = mab-period-manut.cod-comptmento where mmv-tar-ord-manut.cod-evento = "100" and mmv-ord-manut.dat-abert = (select max(mom.dat-abert) from mmv-ord-manut mom inner join mmv-tar-ord-manut mtom on mom.nr-ord-produ = mtom.nr-ord-produ where mtom.cod-evento = "100" group by mmv-ord-manut.cod-eqpto) group by mmv-ord-manut.cod-eqpto, mmv-ord-manut.dat-abert, mmv-tar-ord-manut.nr-ord-produ, mmv-ord-manut.val-hodom-horim, mmv-tar-ord-manut.cod-evento, mab-period-manut.val-km-padr with width 600. output close.
Clique aqui para fazer login e interagir na Comunidade :)