Fórum Otimizar consulta no Progress #507812
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
Curtir tópico
+ 0Post 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-padrMarisiana Battistella
Gostei + 1
Mais Posts
20/01/2015
Fernando Batista
Obrigado pela ajuda!
Gostei + 0
20/01/2015
Marisiana Battistella
Remove a linha "max(mmv-ord-manut.dat-abert)," do GROUP BY...
Gostei + 1
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).
Gostei + 0
20/01/2015
Randrade
Gostei + 0
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.
Gostei + 0
20/01/2015
Marisiana Battistella
Gostei + 0
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....
Gostei + 0
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.
Gostei + 0
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...
Gostei + 0
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.Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)