PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 06/11/2013 10:55:50

[RESOLU] Requête avec count() dans plusieurs tables

Bonjour,


J'ai les tables suivantes :


- commune (gid, insee, nom)
- vanne (gid, type, date, insee)
- ventouse (gid, type, date, insee)


J'exécute la requête suivante pour comptabiliser le nombre de vannes et de ventouses par commune :


SELECT 
  a.insee AS commune, 
  count(b.gid) AS nb_vanne, 
  count(c.gid) AS nb_ventouse

FROM commune a
  LEFT JOIN vanne b ON a.insee = b.insee
  LEFT JOIN ventouse c ON a.insee = c.insee

WHERE a.insee = '86000'

GROUP BY a.insee ;

Le résultat de requête me donne 21840 vannes et 21840 ventouses alors que j'en ai en réalité respectivement 312 et 70... En effet, si je supprime l'un des deux count() et l'un des deux LEFT JOIN correspondant, j'obtiens le bon chiffre. Je ne vois pas trop d'où vient ce problème. Je précise que j'utilise la table commune pour pouvoir afficher l'ensemble des communes et non seulement celles référencées dans les tables vanne et ventouse.


Merci pour votre avis !


Thomas

Dernière modification par Thomas Williamson (06/11/2013 15:03:19)

Hors ligne

#2 06/11/2013 12:07:24

arthurr
Membre

Re : [RESOLU] Requête avec count() dans plusieurs tables

bonjour,

je ne connais pas assez bien votre base, mais un DISTINCT dans le count est peut être suffisant :

SELECT 
  a.insee AS commune, 
  count(distinct b.gid) AS nb_vanne, 
  count(distinct c.gid) AS nb_ventouse

FROM commune a
  LEFT JOIN vanne b ON a.insee = b.insee
  LEFT JOIN ventouse c ON a.insee = c.insee

WHERE a.insee = '86000'

GROUP BY a.insee ;

Hors ligne

#3 06/11/2013 12:26:29

Re : [RESOLU] Requête avec count() dans plusieurs tables

Parfait avec la clause DISTINCT ! Je récupère bien les chiffres voulus. Par contre, après avoir regardé la doc sur ce sujet, je ne comprends pas l'utilisation de DISTINCT sur un gid (clé primaire) car cette colonne est sensée stocker des valeurs uniques... Ça doit tenir au fait que j'interroge plusieurs tables , non ?

Dernière modification par Thomas Williamson (06/11/2013 12:26:49)

Hors ligne

#4 06/11/2013 14:57:43

arthurr
Membre

Re : [RESOLU] Requête avec count() dans plusieurs tables

Si vous avez plusieurs ventouses (id 1 et id 2) pour une vanne (id 1), la vanne (id 1) va être compté 2 fois dans le count(v.id).
Avec le distinct, elle ne va être compté qu'une seule fois.

Hors ligne

Pied de page des forums