Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Printemps des cartes 2024

#1 Mon 24 April 2023 11:09

emmamillefeuille
Juste Inscrit !
Date d'inscription: 26 Apr 2022
Messages: 9

DBeaver erreur "la colonne doit apparaitre dans la clause group by"

Bonjour,

J'utilise DBeaver pour mon traitement de BDD et je tombe aujourd'hui sur cette erreur lorsque j'utilise l'aggrégation GROUP BY. Je crois comprendre que c'est parce que j'appelle des colonnes dans select que je ne rappelle pas dans mon group by.

Néanmoins j'utilisais jusqu'ici le gestionnaire de données de QGIS et je n'ai jamais eu ce soucis avant. Mais je travaillais sur des couches virtuelles, je suis là sur une base PostgreSQL, je ne sais pas si ça change quelque chose.

Code:

with actions_sysma_2022 as (select o.sysma_object_type as "type_objet", a.sysma_action_type as "type_action", 
    actions.sysma_action_id as "numero_actions",
    sum((case when ST_GeometryType(actions.geom) = 'ST_LineString' then ST_Length(actions.geom)/1000 when ST_GeometryType(actions.geom) = 'ST_Polygon' then ST_area (actions.geom)/10000 else null end)) as "emprise",
    case when ST_GeometryType(actions.geom) = 'ST_LineString' then 'km_lineaire' when ST_GeometryType(actions.geom) = 'ST_Polygon' then 'ha_surface' else null end as "unites",
    actions.program_year ,actions.status,actions.geom 
    from eau_brut.sysma_actions actions 
    left join eau_brut.sysma_object_type o on actions.obj_sysma_object_type_id = o.sysma_object_type_id 
    left join eau_brut.sysma_action_type a on actions.sysma_action_type_id = a.sysma_action_type_id
    where group_alias = 'travaux' and actions.program_year = 2022 and actions.status = 'termine'),
    
    actions_sage as (select sage.codenatzone as "code_territoire",sage.nomzone as "nom_territoire",actions_sysma_2022.*,st_intersection(actions_sysma_2022.geom,sage.geom)geom
    from actions_sysma_2022,eau_referentiel.sandre_sage as sage
    where sage.codenatzone IN ('SAGE04015', 'SAGE04032', 'SAGE04033', 'SAGE03005', 'SAGE04008') and st_intersects (actions_sysma_2022.geom,sage.geom))        

select *
from actions_sage

A ce code, il me répond que je dois ajouter la colonne o.sysma_object_type alors que je ne fais même pas de group by et si j'ajoute soigneusement toutes les colonnes de la ligne 1 dans un group by sur la ligne 10,alors i y a un affichage mais les colonnes sont indiquées d'un point orange "pas de correspondance"... Bref je suis un peu perdue et je n'obtiens pas ce que je cherche.

J'aimerais bien à terme, faire mon group by sur le dernier (3") select. mais déjà faire fonctionner les deux blocs premiers.

Est-ce que quelqu'un peut m'expliquer les subtilités de GROUP BY ?

Merci d'avance à tous

Dernière modification par emmamillefeuille (Mon 24 April 2023 11:25)

Hors ligne

 

#2 Mon 24 April 2023 12:25

JP LLORENS
Participant assidu
Date d'inscription: 12 Nov 2008
Messages: 231

Re: DBeaver erreur "la colonne doit apparaitre dans la clause group by"

Bonjour.
Dans la mesure ou vous utilisez la fonction SUM (c'est une agrégation) il faut faire un GROUP_BY dans le with.

Code:

.....
where group_alias = 'travaux' and actions.program_year = 2022 and actions.status = 'termine'
group by  o.sysma_object, a.sysma_action_type, actions.sysma_action_id, actions.program_year ,"unitee",actions.status,actions.geom

Je ne mets pas "emprise" dans le group_by puisque c'est le résultat de l'agrégation.
A priori cela devrait fonctionner.
JP

Hors ligne

 

#3 Mon 24 April 2023 15:05

emmamillefeuille
Juste Inscrit !
Date d'inscription: 26 Apr 2022
Messages: 9

Re: DBeaver erreur "la colonne doit apparaitre dans la clause group by"

Bonjour,

merci pour votre réponse malheureusement cela ne fonctionne pas. Le code s'affiche certes plus d'erreur (j'ai en effet compris, je crois, ce que vous dites à propos de l'agrégation) mais le tableau est entièrement vide, avec les erreurs sur les colonnes marquées d'un point orange et qui indique "Read-only : no corresponding table colomns" alors qu'il s'agit bien des noms de colonnes...

Si vous avez une autre idée je suis preneuse.

Hors ligne

 

#4 Mon 24 April 2023 15:15

emmamillefeuille
Juste Inscrit !
Date d'inscription: 26 Apr 2022
Messages: 9

Re: DBeaver erreur "la colonne doit apparaitre dans la clause group by"

j'ai découpé chaque morceau de code pour tout re-vérifier et j'ai l'impression que le problème vient du 2e bloc là où il y a l'intersection. Est-ce qu'il pourrait s'agir d'un problème de ce côté ? Peut-être de projection ?

Hors ligne

 

#5 Mon 24 April 2023 16:18

JP LLORENS
Participant assidu
Date d'inscription: 12 Nov 2008
Messages: 231

Re: DBeaver erreur "la colonne doit apparaitre dans la clause group by"

2 choses me chiffonnent dans votre code :
-

Code:

st_intersection(actions_sysma_2022.geom,sage.geom)geom

=> pourquoi ajouter un geom après la parenthèse ?
- votre table actions semble contenir de la géométrie de type ligne et polygone => je ne sais pas comment c'est géré dans le st_intersection !
Je n'ai pas l'habitude de travailler avec 2 types de géométrie dans la même colonne geom, mais dans la doc (http://postgis.net/docs/manual-2.4/ST_Intersection.html) il est noté Do not call with a GEOMETRYCOLLECTION as an argument, donc j'aurais tendance à me méfier !

Hors ligne

 

#6 Tue 25 April 2023 10:05

emmamillefeuille
Juste Inscrit !
Date d'inscription: 26 Apr 2022
Messages: 9

Re: DBeaver erreur "la colonne doit apparaitre dans la clause group by"

- parce que je l'ai trouvé comme ça, je ne maitrise pas complètement ce langage et je récupère des petits bouts par-ci par-là et celui ci semble fonctionner. Je dirais qu'il sert à récupérer la géométrie des entités issues de l'intersection

- la table action contient en effet plusieurs types de géométries (il s'agit d'une jointure entre trois jeux d'entités : linéaires, surfaciques et ponctuelles), pour la gestion, je tâche de séparer les différents types avec des cases when pour calculer des longueurs/surfaces

je comprends votre méfiance, en effet ça n'a pas l'air très carré comme méthode, néanmoins je n'appelle pas GEOMETRYCOLLECTION mais simplement geom (si ça change quelque chose ?). Sinon, comment pensez-vous que je puisse "récupérer" la géométrie ? je souhaiterais la garder dans la table pour pouvoir m'en re-servir plus tard au besoin. je souhaite perdre un minimum d'informations si cela est possible.

Hors ligne

 

#7 Tue 25 April 2023 12:19

JP LLORENS
Participant assidu
Date d'inscription: 12 Nov 2008
Messages: 231

Re: DBeaver erreur "la colonne doit apparaitre dans la clause group by"

Bonjour.
J'aurais tendance à travailler sur les polygones d'un coté et le linéaire de l'autre au travers de 2 vues différentes. C'est ma façon de faire, ce n'est pas forcément la meilleure... Si vous avez beaucoup d'objets et que le temps de traitement est long, alors utilisez les vues matérialisées.
Essayez déjà de traiter un seul type d'entité pour valider votre requête.

Hors ligne

 

#8 Wed 26 April 2023 15:35

emmamillefeuille
Juste Inscrit !
Date d'inscription: 26 Apr 2022
Messages: 9

Re: DBeaver erreur "la colonne doit apparaitre dans la clause group by"

bonjour,
je vous remercie pour votre réponse, je vais en effet essayer de séparer mon travail selon le type d'entités ce sera sûrement plus simple.

Dernière modification par emmamillefeuille (Wed 26 April 2023 15:35)

Hors ligne

 

Pied de page des forums

Powered by FluxBB