[Resolvido]Dúvida com SQL - Group by

13 respostas
Don

Olá amigos estou com o seguinte problema:

tenho um conjunto de registros e vou agrupá-los pelo código do registro…esses registros entre outros campos também tem um “tipo de registro” < que é um campo numérico

Quando eu fizer o agrupamento dentro de cada grupo só pode ficar os registros que tiverem o “tipo de registro” igual a algum outro registro do grupo.

Exemplificando:

COD_REGISTRO   DESCRICAO   TIPO_REGISTRO

1                aaaaa               3
1                bbbbb               3

2                ccccc              45
2                dddd               45
2                eeee               3    << esse registro não pode aparecer pois seu tipo não esta duplicado com ninguém do grupo

tentei fazer utilizando a cláusula having porém não obtive resultados…alguém tem alguma sugestão?

Agradeço qualquer ajuda!!!

13 Respostas

Guinter

Opa! coloca o seu sql pra gente analisar.

Don

Meu SQL esta mais ou menos assim:

SELECT r.COD, r.DESCRICAO, r.TIPO from Registro r where r.COD in(1,2) and r.TIPO in(3,45) group by r.COD,

o que me esta faltando é conhecimento para fazer o group by…aliás nem consegui descobrir se é possivel fazer o que estou tentando…

valeu

fabio.cbrandao

Não é muito minha praia mais vamos tentar ajudar… rsrs

SELECT Temp, Count(*)  from Registro r where r.COD in(1,2) and r.TIPO in(3,45) group by r.COD, r.TIPO where Temp > 1

sei lah tenta algo do tipo assim…

Don

fabio.cbrandao:
Não é muito minha praia mais vamos tentar ajudar… rsrs

SELECT Temp, Count(*)  from Registro r where r.COD in(1,2) and r.TIPO in(3,45) group by r.COD, r.TIPO where Temp > 1

sei lah tenta algo do tipo assim…

Obrigado pela resposta…porém não funciona dessa maneira…repare que no outro grupo tem registros com o mesmo “TIPO”, ou seja o count dará maior que 1…só consigo identificar o registro que não é para aparecer depois de agrupado =s

Don

up

RenataFA

Oi amigo!

Eu sei resolver… uso algo parecido, mas antes eu precisava saber uma coisa, sua tabela tem algum campo ID que possa identificar de forma única o registro?
Existe a possibilidade de termos registros idênticos repetidos? Quero dizer, os 3 campos que vc mostrou estarem todos iguaizinhos?

Responda por favor que eu monto pra vc… ah, me fala qual o BD que vc usa tb.

O

Mysql.

Don

RenataFA:
Oi amigo!

Eu sei resolver… uso algo parecido, mas antes eu precisava saber uma coisa, sua tabela tem algum campo ID que possa identificar de forma única o registro?
Existe a possibilidade de termos registros idênticos repetidos? Quero dizer, os 3 campos que vc mostrou estarem todos iguaizinhos?

Responda por favor que eu monto pra vc… ah, me fala qual o BD que vc usa tb.

Oi Renata, obrigado pela resposta…

sim…minha tabela tem um campo ID que é unico para cada registro e também existe a possibilidade de os campos estarem idênticos, o banco é oracle…

O

O having funciona tambem no Oracle.

Dá uma olhada no link
http://www.psoug.org/reference/group_by.html

Nele tem varios exemplos de group by do oracle.

RenataFA
Don:
RenataFA:
Oi amigo!

Eu sei resolver... uso algo parecido, mas antes eu precisava saber uma coisa, sua tabela tem algum campo ID que possa identificar de forma única o registro?
Existe a possibilidade de termos registros idênticos repetidos? Quero dizer, os 3 campos que vc mostrou estarem todos iguaizinhos?

Responda por favor que eu monto pra vc... ah, me fala qual o BD que vc usa tb.

Oi Renata, obrigado pela resposta...

sim...minha tabela tem um campo ID que é unico para cada registro e também existe a possibilidade de os campos estarem idênticos, o banco é oracle...

Bem amigo, eu resolvi sem usar o GROUP BY. Se vc precisar agrupar depois, vc usa. O fato é que vc disse que precisava listar sempre que o tipo_registro estivesse duplicado com alguém mais do grupo (ou seja, do cod_registro, pelo que entendi).

Para esse tipo de situação, não preciso do GROUP BY. Fiz assim:

select h.cod_registro, h.descricao, h.tipo_registro
  from registro h

left join registro i on i.cod_registro = h.cod_registro
                    and i.tipo_registro = h.tipo_registro
                    and i.id &lt;&gt; h.id

 where i.id is not null

Tá simples, sem ordenar, sem agrupar, sem nada. Ai vc vê o que mais vc precisa.
Explicando o que eu fiz: eu fiz um join relacionando a tabela a ela mesma, relaciono a tabela registro a própria tabela registro. Tento encontrar um outro registro diferente do que eu estou (por isso pego quando os IDs forem diferentes) que também possua o mesmo cod_registro e tipo_registro. Se eu encontrar (por isso o i.id is not null) eu trago o registro, senão não.

Execute ai e veja como fica. Aqui ficou assim:

cod_registro,descricao,tipo_registro
1, 'bbbbb', 3
1, 'aaaaa', 3
2, 'ddddd', 45
2, 'ccccc', 45

Qq dúvida é só falar.

[]'s
Renata

pmlm
RenataFA:

Bem amigo, eu resolvi sem usar o GROUP BY. Se vc precisar agrupar depois, vc usa. O fato é que vc disse que precisava listar sempre que o tipo_registro estivesse duplicado com alguém mais do grupo (ou seja, do cod_registro, pelo que entendi).

Para esse tipo de situação, não preciso do GROUP BY. Fiz assim:

select h.cod_registro, h.descricao, h.tipo_registro
  from registro h

left join registro i on i.cod_registro = h.cod_registro
                    and i.tipo_registro = h.tipo_registro
                    and i.id &lt;&gt; h.id

 where i.id is not null
Os duplicados são sempre só 2? Assim de repente acho que isso não funciona se houver, por exemplo, o seguinte caso:
cod_registro,descricao,tipo_registro  
    1, 'bbbbb', 3  
    1, 'aaaaa', 3  
    1, 'xxxxx', 3  
    2, 'ddddd', 45  
    2, 'ccccc', 45  
    3, 'zzzzz', 25
RenataFA

Bom, o que entendi é que tem que ter outro do msm tipo_registro dentro do mesmo cod_registro. Independente de se é duplicado, triplicado, quaduplicado, etc…rs…

Se não for isso avise…

Don

resolvido…muito obrigado Renata!!!

Criado 5 de outubro de 2009
Ultima resposta 8 de out. de 2009
Respostas 13
Participantes 6