#1 Tue 08 November 2022 17:04
- yaks48
- Participant occasionnel
- Date d'inscription: 3 Nov 2022
- Messages: 17
QGIS/SQL: Probl avec la fonction GROUP BY
Bonjour,
je dois faire des jointures spatiales entre mes parcelles à analyser d'une part et une base de données de différents zonages d'autre part.
le but est de renvoyer une couche des parcelles analysées avec des champs créés pour chacune des couches de la base de données. voici un extrait de code
Code:
select parcelles.geom, CASE WHEN sum(st_area(st_intersection(parcelles.geom, apb.geom)))>0.05*st_area(parcelles.geom) THEN 1 ELSE 0 END as r_apb, CASE WHEN sum(st_area(st_intersection(parcelles.geom, apg.geom)))>0.05*st_area(parcelles.geom) THEN 1 ELSE 0 END as r_apg, rpg_ilots.libelle_gr as cult, row_number() OVER () as champ_uni from parcelles left join apb on st_intersects(parcelles.geom, apb.geom) left join apg on st_intersects(parcelles.geom, apg.geom) left join rpg_ilots on st_intersects(parcelles.geom, rpg_ilots.geom) group by parcelles.geom
j'ai le message d'erreur : "la colonne « rpg_ilots.libelle_gr » doit apparaître dans la clause GROUP BY ou doit être utilisé dans une fonction d'agrégat"
dans ce code je souhaite faire la jointure entre mes parcelles et par exemple la table "apb" : il faut que la somme des surfaces d'intersection entre les polygones apb et chacune des parcelles soit inférieure à 5 % de la surface de la parcelle.
il faut que le libellé de culture du rpg se retrouve pour chaque parcelle analysée.
chaque entité de la couche "parcelles" à analyser doit donc au final avoir 3 champs supplémentaires : r_apb (qui vaut 0 ou 1), r_apg (qui vaut 0 ou 1), et (cult qui est du texte).
Auriez-vous une solution ?
Merci infiniment pour le temps passé sur cette question
Hors ligne
#2 Wed 09 November 2022 10:18
- yaks48
- Participant occasionnel
- Date d'inscription: 3 Nov 2022
- Messages: 17
Re: QGIS/SQL: Probl avec la fonction GROUP BY
[EDIT]
J'ai trouvé une partie de la solution qui a amené une autre question.
L'ensemble des champs créés doivent être dans le "group by" - je ne comprends pas pourquoi car je voulais grouper seulement selon la géométrie de mes parcelles à analyser.
en regroupant, les différentes bases de données étant pas hyper bien calées, je me retrouve avec des parcelles qui interceptent des ilots différents de ma table rpg_ilots
j'ai donc introduit une expression
Code:
CASE WHEN st_area(st_intersection(parcelles.geom,rpg_ilots.geom)) > 0.05*st_area(parcelles.geom) THEN rpg_ilots.libelle_gr ELSE NULL END as cult
dans l'idéal, je voudrais qu'il ne crée pas une nouvelle ligne avec un attribut "null"
je voudrais que si l'intersection est > à 5 % de la surface de la parcelle, qu'il ne l'affiche pas.
Hors ligne
#3 Wed 09 November 2022 11:38
- ppluvinet
- Participant assidu
- Lieu: VALENCE
- Date d'inscription: 6 Aug 2007
- Messages: 611
Re: QGIS/SQL: Probl avec la fonction GROUP BY
Bonjour,
est-ce qu'un HAVING ne premettrait pas de ne pas renvoyer les NULL ?
Code:
GROUP BY parcelles.geom, rpg_ilots.libelle_gr HAVING sum(st_area(st_intersection(parcelles.geom, apb.geom)))>0.05*st_area(parcelles.geom)
Bonne continuation
Pascal PLUVINET
Hors ligne
#4 Wed 09 November 2022 13:28
- yaks48
- Participant occasionnel
- Date d'inscription: 3 Nov 2022
- Messages: 17
Re: QGIS/SQL: Probl avec la fonction GROUP BY
Bonjour,
Merci beaucoup pour votre aide.
ayant plusieurs jeux de données j'ai mis un "OR" entre les deux pour la clause HAVING.
Code:
HAVING sum(st_area(st_intersection(parcelles.geom, rpg_ilots_2008.geom)))>0.05*st_area(parcelles.geom) or sum(st_area(st_intersection(parcelles.geom, rpg_ilots_2021.geom)))>0.05*st_area(parcelles.geom)
Avec cette clause HAVING est-ce que j'élimine aussi des entités qui n'intersecteraient pas le RPG mais qui intersecteraient autre chose ?
J'entends : si j'ai une intersection entre parcelles et apb mais pas entre parcelles et rpg_ilots, alors cette ligne sera éliminée?
Car je cherche à ne retourner qu'une seule entité avec un champ "apb" = 0 ou 1 ; "apg" = 0 ou 1 ; "cult" = le libellé du groupe culture ou NULL si pas intercepté.
Hors ligne