Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

luan_alves

[Resolvido] problemas com group by

Recommended Posts

Bom dia a todos!

 

Estou tendo problema com a cláusula "group by" em uma consulta que estou realizando.

O problema é que no select eu seleciono alguns campos e no group by eu só passo 1, e ai da erro.

 

Aqui esta a consulta

SELECT C.COMU_ID,
      C.COMU_TITULO,
      C.COMU_DESC_TEXTO,
      C.COMU_DESC_IMAGEM,
      U.USUA_NOME 
 FROM PRT_COMUNICADO_EMPREENDIMENTO CE 
 INNER JOIN PRT_COMUNICADO C ON CE.COMU_ID = C.COMU_ID INNER JOIN PRT_USUARIO U ON U.USUA_ID = C.USUA_ID 
 WHERE CE.EMPR_ID = 1 
GROUP BY C.COMU_ID

 

e o erro é este:

Erro de SQL: ORA-00979: não é uma expressão GROUP BY

00979. 00000 - "not a GROUP BY expression"

Compartilhar este post


Link para o post
Compartilhar em outros sites

Passe todo o agrupamento.

Pq o uso de group by neste caso ?

 

 

SELECT C.COMU_ID,
      C.COMU_TITULO,
      C.COMU_DESC_TEXTO,
      C.COMU_DESC_IMAGEM,
      U.USUA_NOME 
 FROM PRT_COMUNICADO_EMPREENDIMENTO CE 
 INNER JOIN PRT_COMUNICADO C ON CE.COMU_ID = C.COMU_ID INNER JOIN PRT_USUARIO U ON U.USUA_ID = C.USUA_ID 
 WHERE CE.EMPR_ID = 1 
GROUP BY C.COMU_ID,
      C.COMU_TITULO,
      C.COMU_DESC_TEXTO,
      C.COMU_DESC_IMAGEM,
      U.USUA_NOME

Compartilhar este post


Link para o post
Compartilhar em outros sites

Passe todo o agrupamento.

Pq o uso de group by neste caso ?

 

 

SELECT C.COMU_ID,
      C.COMU_TITULO,
      C.COMU_DESC_TEXTO,
      C.COMU_DESC_IMAGEM,
      U.USUA_NOME 
 FROM PRT_COMUNICADO_EMPREENDIMENTO CE 
 INNER JOIN PRT_COMUNICADO C ON CE.COMU_ID = C.COMU_ID INNER JOIN PRT_USUARIO U ON U.USUA_ID = C.USUA_ID 
 WHERE CE.EMPR_ID = 1 
GROUP BY C.COMU_ID,
      C.COMU_TITULO,
      C.COMU_DESC_TEXTO,
      C.COMU_DESC_IMAGEM,
      U.USUA_NOME

 

Se eu passar todo o agrupamento o parametro "U.USUA_NOME" ira agrupar os usuários, e a regra deixa 1 usuário cadastrar mais de 1 comunicado.

O agrupamento neste caso é exatamente por isso, como um usuári poderá cadastrar mais de 1 comunicado, então na consulta o mesmo comunicado poderá retornar mais de uma vez, então o group by pelo parametro "C.COMU_ID (é o id da tabela comunicado)", não deixará que mostre comunicados duplicados

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nem tem jeito, o agrupamento em SQL são os campos do select.

 

O que pode ser feito é :

 

sumarizar

 

SELECT C.COMU_ID,
      C.COMU_TITULO,
      C.COMU_DESC_TEXTO,
      C.COMU_DESC_IMAGEM,
      count(U.USUA_NOME) qtdnome 
 FROM PRT_COMUNICADO_EMPREENDIMENTO CE 
 INNER JOIN PRT_COMUNICADO C ON CE.COMU_ID = C.COMU_ID INNER JOIN PRT_USUARIO U ON U.USUA_ID = C.USUA_ID 
 WHERE CE.EMPR_ID = 1 
GROUP BY C.COMU_ID,
      C.COMU_TITULO,
      C.COMU_DESC_TEXTO,
      C.COMU_DESC_IMAGEM

 

e/ou tratar isto na camada de aplicação, tipo um gerador de relatório etc.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nem tem jeito, o agrupamento em SQL são os campos do select.

 

O que pode ser feito é :

 

sumarizar

 

SELECT C.COMU_ID,
      C.COMU_TITULO,
      C.COMU_DESC_TEXTO,
      C.COMU_DESC_IMAGEM,
      count(U.USUA_NOME) qtdnome 
 FROM PRT_COMUNICADO_EMPREENDIMENTO CE 
 INNER JOIN PRT_COMUNICADO C ON CE.COMU_ID = C.COMU_ID INNER JOIN PRT_USUARIO U ON U.USUA_ID = C.USUA_ID 
 WHERE CE.EMPR_ID = 1 
GROUP BY C.COMU_ID,
      C.COMU_TITULO,
      C.COMU_DESC_TEXTO,
      C.COMU_DESC_IMAGEM

 

e/ou tratar isto na camada de aplicação, tipo um gerador de relatório etc.

 

 

Então eu fiz uma gambiarra para funcionar.

ficou desta forma:


SELECT C.COMU_ID,
      MAX(C.COMU_TITULO) TITULO,
      MAX(C.COMU_DESC_TEXTO) TEXTO,
      MAX(C.COMU_DESC_IMAGEM) IMAGEM,
      MAX(U.USUA_NOME) NOME
 FROM PRT_COMUNICADO_EMPREENDIMENTO CE 
 INNER JOIN PRT_COMUNICADO C ON CE.COMU_ID = C.COMU_ID INNER JOIN PRT_USUARIO U ON U.USUA_ID = C.USUA_ID 
 WHERE CE.EMPR_ID = 1 
GROUP BY C.COMU_ID

 

não é uma forma elegante de resolver, mas funcionou.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.