Otimizar consulta no Progress
Olá galera, bom dia a todos!
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
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
Curtidas 0
Melhor post
Marisiana Battistella
20/01/2015
Olá!
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?
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
GOSTEI 1
Mais Respostas
Fernando Batista
20/01/2015
Olá Marisiana, tentei implementar o bloco que você me passou, mas deu um erro na linha 3 da minha query. (select mmv-ord-manut.cod-eqpto,). Não consegui encontrar o erro, você tem alguma ideia?
Obrigado pela ajuda!
Obrigado pela ajuda!
GOSTEI 0
Marisiana Battistella
20/01/2015
Eu não vi que tinha duas funções MAX....
Remove a linha "max(mmv-ord-manut.dat-abert)," do GROUP BY...
Remove a linha "max(mmv-ord-manut.dat-abert)," do GROUP BY...
GOSTEI 1
Fernando Batista
20/01/2015
Consegui executar sem erros, porém.... Agora meu relatório não mostra apenas um resultado como anteriormente, ele me mostrar vários resultados, no caso, eu preciso do resultado que tenha a data mais recente (max(mmv-ord-manut.dat-abert)).
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).
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).
GOSTEI 0
Randrade
20/01/2015
Como ficou o seu select agora?
GOSTEI 0
Fernando Batista
20/01/2015
Ficou desta forma:
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.
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.
GOSTEI 0
Marisiana Battistella
20/01/2015
Nesse caso, você vai ter q definir isso na cláusula WHERE, para que a consulta retorne apenas os dados da maior data....
GOSTEI 0
Marisiana Battistella
20/01/2015
Talvez essa seja uma possível solução:
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....
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....
GOSTEI 0
Fernando Batista
20/01/2015
Muito obrigado Marisiana, me desculpe pela falta de retorno, tive alguns imprevisto com meu servidor e fiquei sem internet.
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:
Desde já, obrigado pela atenção de quem me ajudou, e me desculpem pela falta de feed.
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.
GOSTEI 0
Marisiana Battistella
20/01/2015
Sem problema!!
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:
Precisa ver qual é a informação que será mostrada na coluna, se é um valor, uma data, etc...
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...
GOSTEI 0
Fernando Batista
20/01/2015
É.. Assim também não funcionou, a minha grande dificuldade aqui, é que o banco que eu trabalho (Progress) usa um compilador que não funciona muito bem com sql, ele usa alguma sintaxes diferentes. No caso, a cláusula case não funcionou de jeito nenhum... Enfim..
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:
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.
GOSTEI 0