[RESOLVIDO] - Ajuda BD oracle

9 respostas
S

Ola galera!!

Estou com um problema pra conseguir um resultado de select no oracle.
É o seguinte.

tenho uma pesquisa que retorna o seguinte:

IDGRUPOFATOR
401
401
422
402
402
421

A query é:

select * from (

select ordem.idgrupofator from(select distinct fte.idgrupofator, fp.idfatorplanoav from SGC.fatorplanoav fp

inner join SGC.axdescfatorespecifico fte on (fp.idaxfatorespecifico = fte.iddescfatorespecifico)

where fp.idplavaliacao = 1027 order by fp.idfatorplanoav)ordem

order by rownum asc

);

O que eu preciso é que nenhum dos valores do resultado seja repetido, ou seja, preciso que o resultado seja:

IDGRUPOFATOR
401
422
402
421

O que mais importa pra mim é ter esse resultado exatamente nessa ordem.
A ordem é definida pelo order by fp.idfatorplanoav da query, por isso o distinct não funciona.
Tentei o group by, mas como os valores fp.idfatorplanoav são diferentes, também não funciona.

Alguém pode me ajudar.
Aceito sugestões, resoluções, links, qualquer coisa.

OBS: Tenho que fazer isso em um único select e, somente via banco de dados (não posso usar nada da aplicação pra ajudar [inferno!!!]).

Grato.

9 Respostas

S

Estava pensando se teria uma forma de comparar as linhas do resultado do select para filtrar isso?

alanbrasil1984

coloca distinct no * central, caso esteja usando EJB ai ja complica…

S

Não funciona.

O resultado do select (de dentro) é mais ou menos isso:

IDGRUPOFATOR idfatorplanoav
401 25
401 1
422 36
402 200
402 24
421 96

Quando eu dou o distinct, ele traz ainda todos os resultados por causa que o idfatorplanoav é diferente em todas as linhas.

alanbrasil1984

faz o seguinte coloca a estrutura das tabelas que fica melhor pra ajudar…

A

suarphi:
Não funciona.

O resultado do select (de dentro) é mais ou menos isso:

IDGRUPOFATOR idfatorplanoav
401 25
401 1
422 36
402 200
402 24
421 96

Quando eu dou o distinct, ele traz ainda todos os resultados por causa que o idfatorplanoav é diferente em todas as linhas.

Considerando esse resultado intermediário como uma tabela X, podemos agrupar por IDGRUPOFATOR e pegar o mínimo IDFATORPLANOAV (para ordenação)

Daí num outro select externo você pega apenas o IDGRUPOFATOR ordenando pelo mínimo IDFATORPLANOAV.

Algo assim:

SELECT IDGRUPOFATOR 
  FROM (
      SELECT IDGRUPOFATOR, MIN(IDFATORPLANOAV) MINFATOR
      FROM X -- X = resultado do select intermediário
      GROUP BY IDGRUPOFATOR
  )
  ORDER BY MINFATOR
ManoJava

Bom dia!

Vc poderia fazer um SUM desse campo em que existe mais de um valor e agrupar pelo IDGRUPOFATOR, o resultado acredito que ficaria assim:

IDGRUPOFATOR idfatorplanoav
401 26
422 36
402 224
421 96

Att.

S

ManoJava,

não deu certo também.

O resultado real ficou assim:

idgrupofator idfatorplanoav
422 3233
421 3236
401 6463
402 6469

A select que usei agora foi:

select * from (

select distinct fte.idgrupofator,

sum(fp.idfatorplanoav) as idfatorplanoav

from SGC.fatorplanoav fp

inner join SGC.axdescfatorespecifico fte on (fp.idaxfatorespecifico = fte.iddescfatorespecifico)

where fp.idplavaliacao = 1027 group by fte.idgrupofator

) order by idfatorplanoav

;

A ordem que eu preciso é:
/*
401
422
402
421
*/

S

AbelBueno:
suarphi:
Não funciona.

O resultado do select (de dentro) é mais ou menos isso:

IDGRUPOFATOR idfatorplanoav
401 25
401 1
422 36
402 200
402 24
421 96

Quando eu dou o distinct, ele traz ainda todos os resultados por causa que o idfatorplanoav é diferente em todas as linhas.

Considerando esse resultado intermediário como uma tabela X, podemos agrupar por IDGRUPOFATOR e pegar o mínimo IDFATORPLANOAV (para ordenação)

Daí num outro select externo você pega apenas o IDGRUPOFATOR ordenando pelo mínimo IDFATORPLANOAV.

Algo assim:

SELECT IDGRUPOFATOR 
  FROM (
      SELECT IDGRUPOFATOR, MIN(IDFATORPLANOAV) MINFATOR
      FROM X -- X = resultado do select intermediário
      GROUP BY IDGRUPOFATOR
  )
  ORDER BY MINFATOR

Cara, funcionou.
Valeu mesmo!

fiz a query dessa forma:

select * from (

select distinct fte.idgrupofator,

min(fp.idfatorplanoav) as idfatorplanoav

from SGC.fatorplanoav fp

inner join SGC.axdescfatorespecifico fte on (fp.idaxfatorespecifico = fte.iddescfatorespecifico)

where fp.idplavaliacao = 1027 group by fte.idgrupofator

)order by idfatorplanoav

;

o resultado ficou:

idgrupofator idfatorplanoav
401 3231
422 3233
402 3234
421 3236

Deixo meus agradecimentos a todos da comunidade que me ajudaram. vcs são 10!
valeu!

S

rsrsrsrs
Pessoal, agora como eu faço para mudar o status desse tópico para resolvido?

OBS: é o meu primeiro.

:oops:

Criado 21 de dezembro de 2011
Ultima resposta 22 de dez. de 2011
Respostas 9
Participantes 4