Pages: 1
- Sujet précédent - Renvoyer zéro lorsqu'une géométrie n'est pas dans une autre - Sujet suivant
#1 Tue 14 December 2021 14:25
- Hippo
- Participant actif
- Date d'inscription: 18 Jan 2015
- Messages: 57
Renvoyer zéro lorsqu'une géométrie n'est pas dans une autre
Bonjour,
J'ai 2 tables.
Une des table avec les communes de France, et l'autre avec les équipements sportifs.
Je souhaiterais calculer combien j'ai de salles de sport par commune.
J'arrive évidemment à calculer ce nombre dans les communes qui ont une ou plusieurs salles de sport en utilisant ST_DWithin sur les géométries, mais comment renvoyer zéro dans les communes qui n'en ont pas ? Je pensais utiliser ST_DISJOINT mais je ne suis pas sûr que ce soit approprié ...
Voilà ma requête actuelle toute simple :
SELECT count(equip.id),
equip.nom_sdp,
equip.geom,
com.code_insee,
com.nom_comm,
FROM equipements AS equip,
communes AS com
WHERE ST_DWithin(equip.geom, com.geom,0)
Hors ligne
#2 Tue 14 December 2021 16:07
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1159
Re: Renvoyer zéro lorsqu'une géométrie n'est pas dans une autre
Salut,
sans doute pas vraiment optimal mais je ferais comme çà :
Code:
SELECT count( case when ST_DWithin(equip.geom, com.geom,0) then 1 else NULL END ), com.code_insee, com.nom_comm, FROM equipements AS equip, communes AS com GROUP BY com.code_insee, com.nom_comm ;
On peut utiliser la clause filter à la place du case si on utilise postgresql.
Dernière modification par tumasgiu (Tue 14 December 2021 16:07)
Hors ligne
#3 Tue 14 December 2021 16:24
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Renvoyer zéro lorsqu'une géométrie n'est pas dans une autre
Bonjour,
Pourquoi pas un left join ?
Code:
SELECT coalesce(count(equip.id), 0) as cnt, com.code_insee FROM communes AS com left join equipements AS equip ON ST_DWithin(equip.geom, com.geom,0) group by com.code_insee;
(Tumasgiu: Attention sans jointure, la requete va prendre des plombes et ne vas pas utiliser l'index spatial.)
Nicolas
Hors ligne
#4 Tue 14 December 2021 16:57
- Hippo
- Participant actif
- Date d'inscription: 18 Jan 2015
- Messages: 57
Re: Renvoyer zéro lorsqu'une géométrie n'est pas dans une autre
Tout d'abord merci à tous les 2 pour vos réponses.
Tumasgiu, ce que tu proposes marche tout à fait, bien que comme précisé par Nicolas, la requête rame un peu.
Nicolas, en fait j'étais parti sur un left join au départ mais ma requête ne fonctionnait pas.
J'ai essayé ce que vous proposez mais idem, la table retournée ne prends pas en compte les lignes des communes qui n'ont aucun équipement.
Hors ligne
#5 Tue 14 December 2021 17:21
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Renvoyer zéro lorsqu'une géométrie n'est pas dans une autre
Hmm ca devrait
J'ai testé la requete sur une table commune et ca retourne bien 36,613 lignes (oui, c'est une vieille table commune )
Vous avez une clause where dans votre requête ? et c'est bien la table commune qui est a gauche du join ?
Un left join retourne toujours toutes les lignes de la table de gauche, sauf en cas de where qui filtre en plus.
les premieres lignes de résultat de ma requete:
le reste, c'est 0 pour toutes les autres communes.
Vous pouvez poster votre requête exacte ?
Nicolas
count insee_com
7 40152
3 40303
3 40311
2 40243
2 40075
2 40285
1 40210
1 40246
1 40094
1 40165
1 40215
1 40006
1 40123
0 01015
0 01016
0 01017
0 01019
0 01021
0 01022
0 01023
0 01024
0 01025
0 01026
0 01027
...
Hors ligne
#6 Tue 14 December 2021 17:38
- Hippo
- Participant actif
- Date d'inscription: 18 Jan 2015
- Messages: 57
Re: Renvoyer zéro lorsqu'une géométrie n'est pas dans une autre
Bien vu Nicolas !
J'avais mis un WHERE après le ON ST_Within ...
J'ai remplacé le WHERE tout logiquement par un AND et ça marche parfaitement !
Merci d'avoir pris le temps de m'aider :-)
Hors ligne
#7 Tue 14 December 2021 19:34
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1159
Re: Renvoyer zéro lorsqu'une géométrie n'est pas dans une autre
Bonjour,
Pourquoi pas un left join ?Code:
SELECT coalesce(count(equip.id), 0) as cnt, com.code_insee FROM communes AS com left join equipements AS equip ON ST_DWithin(equip.geom, com.geom,0) group by com.code_insee;(Tumasgiu: Attention sans jointure, la requete va prendre des plombes et ne vas pas utiliser l'index spatial.)
Nicolas
Bonne question, je devais être un peu à l'ouest et j'ai pensé que le left join fonctionnerait pas .
Hors ligne
Pages: 1
- Sujet précédent - Renvoyer zéro lorsqu'une géométrie n'est pas dans une autre - Sujet suivant