Array
(
    [0] => stdClass Object
        (
            [Votos_Balanceados] => 1
            [id] => 507814
            [titulo] => Otimizar consulta no Progress
            [dataCadastro] => DateTime Object
                (
                    [date] => 2015-01-20 08:43:32
                    [timezone_type] => 3
                    [timezone] => America/Sao_Paulo
                )

            [isFirstPost] => -1
            [idUsuario] => 262490
            [status] => A
            [isExample] => 
            [NomeUsuario] => Marisiana Battistella
            [Apelido] => Marisiana
            [Foto] => 262490_20141229171421.jpg
            [Conteudo] => 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?
[code]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[/code] ) )

Otimizar consulta no Progress

Fernando Batista
   - 20 jan 2015

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

Post mais votado

Marisiana
   - 20 jan 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?
#Código

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

Fernando Batista
   - 20 jan 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!

Marisiana
   - 20 jan 2015

Eu não vi que tinha duas funções MAX....
Remove a linha "max(mmv-ord-manut.dat-abert)," do GROUP BY...

Fernando Batista
   - 20 jan 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).

Randrade
   - 20 jan 2015

Como ficou o seu select agora?

Fernando Batista
   - 20 jan 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.

Marisiana
   - 20 jan 2015

Nesse caso, você vai ter q definir isso na cláusula WHERE, para que a consulta retorne apenas os dados da maior data....

Marisiana
   - 20 jan 2015

Talvez essa seja uma possível solução:
#Código

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....

Fernando Batista
   - 24 jan 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:
#Código

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.

Marisiana
   - 24 jan 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:
#Código

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...

Fernando Batista
   - 27 jan 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: #Código

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.