La colonne « constatsol1_.co_trt_crea» doit apparaître dans la clause GROUP BY ou doit être utilisé dans une fonction d'agrégat

Ce problème concerne les SGBD connu autre que MySQL, et nous allons le voir un peux plus loin. 

GROUP BY dans une requête ça sert à quoi ?

La clause SQL GROUP BY est utilisée en collaboration avec l'instruction SELECT pour organiser les données identiques en groupes. Cette clause GROUP BY suit la clause WHERE dans une instruction SELECT et précède la clause ORDER BY.


Jusqu'à la, tout est bon !

Par contre, dans la requête HQL suivante on aura une erreur

SELECT mvt FROM Mouvement mvt LEFT JOIN FETCH mvt.constatSolde cs WHERE cs.itMailleEchange IS NOT NULL AND "
			+ " cs.itMailleEchange = :idTechniqueMaille AND cs.compte.idTechnique=:idTechniqueCompte AND mvt.dateMouvement <= :dateMin AND "
			+ " mvt.dateMouvement >= :dateMax AND mvt.codeTypeMouvement IN :PMMvtPourEvtCpt "
			+ "GROUP BY mvt.idTechnique, mvt.dateMouvement, mvt.codeTypeMouvement

Cette requête génère l'erreur suivante avec PostgreSQL :

Caused by: org.postgresql.util.PSQLException: ERREUR: la colonne ˠconstatsol1_.co_trt_crea ۠doit apparaﵲe dans la clause GROUP BY ou doit 뵲e utilis顤ans une fonction d'agrꨡt
  Position: 815

Et si je rajoute la colonne co_trt_crea à mon GROUP BY, j'aurai une la même erreur que la précédente, mais te demandant d'ajouter une nouvelle colonne.

Cette erreur est générer comme le SGBD ne sais pas quoi faire avec les autres colonnes qui ne sont pas spécifier dans la clause GROUP BY, et qui sont dans la clause SELECT, donc une solution est d'ajouter pour chacune de ces colonnes une fonction d'agrégation (SUM, AVG, etc), mais est ce c'est util ? Dans mon cas non !

Des solution de contournement existe, en récrivant la requête sans GROUP BY, afin de renvoyer le même résultat avec GROUP BY.

Pour ceux qui viennent de MySQL, ils auront pas cette erreur pour la même requête (tout en la convertissant en de hql vers sql), parce que MySQL par défaut, il autorise de ne pas utiliser toutes les colonnes dans le GROUP BY, sauf qu'on peux changer ce paramétrage, en activant la valeur de ONLY_FULL_GROUP_BY  .


Amagrad-a i ttwaɣra 669 iberdan

Author
ⴱⵓⵖⴰⵏⵉ ⵔⴰⴼⵉⵇ