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 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: 1132

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: 1536

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: 1536

Re: Renvoyer zéro lorsqu'une géométrie n'est pas dans une autre

Hmm ca devrait wink

J'ai testé la requete sur une table commune et ca retourne bien 36,613 lignes (oui, c'est une vieille table commune big_smile )
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: 1132

Re: Renvoyer zéro lorsqu'une géométrie n'est pas dans une autre

Nicolas Ribot a écrit:

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 big_smile.

Hors ligne

 

Pied de page des forums

Powered by FluxBB