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 04/02/2014 17:06:54

[RESOLU] Aide sur une requête

Bonjour,


J'ai la table suivante qui dénombre les forages et des réservoirs par commune (pour les réservoirs, on distingue le nombre suivant le type de réservoir) :


  agence    |  commune         |  nb_forage    |  type_reservoir    |  nb_reservoir
------------+------------------+---------------+--------------------+----------------
  1         |  86001           |  2            |  01                |  1
  1         |  86002           |  3            |  01                |  1
  1         |  86002           |  3            |  02                |  2
  2         |  86003           |  1            |  01                |  3
  2         |  86003           |  1            |  01                |  3
  2         |  86004           |  0            |  02                |  3

Je cherche à calculer le nombre de forages par agence. La requête ci-dessous me renvoie un résultat erroné car elle fait la somme des forages sans tenir compte du fait que certaines communes apparaissent deux fois. Cela paraît inévitable car les réservoirs sont par ailleurs dénombrés suivant le type de réservoir. Ainsi, si j'ai deux types de réservoirs sur une commune, j'ai deux lignes pour cette commune et donc le nombre de forages apparaît deux fois.


SELECT agence, sum(nb_forage) FROM maTable GROUP BY agence ;

Ma question : comment puis-je dénombrer les forages par agence en ne retenant qu'une seule ligne par commune ? Puis-je le faire plus simplement qu'en passant par une table temporaire avec un WITH ?


Merci pour votre aide !


Thomas

Dernière modification par Thomas Williamson (06/02/2014 10:56:01)

Hors ligne

#2 04/02/2014 20:50:10

SQLpro
Membre

Re : [RESOLU] Aide sur une requête

Votre demande est logiquement incohérente. En effet, si vous avez le jeu de données suivant, quelle réponse voulez-vous obtenir ?

  agence    |  commune         |  nb_forage    |  type_reservoir    |  nb_reservoir
------------+------------------+---------------+--------------------+----------------
  1         |  86001           |  2            |  01                |  1
  1         |  86002           |  3            |  01                |  1
  1         |  86002           |  3            |  02                |  2
  2         |  86003           |  1            |  01                |  3
  2         |  86003           |  2            |  01                |  3
  2         |  86003           |  1            |  01                |  3
  2         |  86004           |  0            |  02                |  3

A +


Frédéric Brouard, alias SQLpro,  ARCHITECTE DE DONNÉES,  Expert langage SQL
Le site sur les SGBD relationnel et langage SQL   : http://sqlpro.developpez.com/
Modélisation de données, conseil, expertise, audit, optimisation, tuning, formation
* * * * *  Enseignant CNAM PACA, ISEN Toulon,  CESI Aix en Provence  * * * * *

Hors ligne

#3 04/02/2014 21:03:35

Re : [RESOLU] Aide sur une requête

Bonjour,


Je souhaiterais faire la somme du nombre de forages par agence, en ne retenant qu'une seule ligne par commune (puisque chaque ligne de commune dupliquée comporte le même nombre de forages). Ma question est donc de savoir si cela est possible dans une requête ou s'il convient que je sépare mon jeu de données en traitant séparément les ouvrages et les réservoirs. J'ai l'impression d'être un abruti de première, à la façon dont vous me répondez.


Merci pour votre aide (si j'en vaux la peine).


Thomas

Dernière modification par Thomas Williamson (04/02/2014 21:03:52)

Hors ligne

#4 04/02/2014 23:42:01

gleu
Administrateur

Re : [RESOLU] Aide sur une requête

SQLpro a cette façon de répondre tout à fait désagréable qui laisse à penser à tout le monde que lui-même est un génie et le reste du monde des cons sans nom. Je ne crois pas que vous puissiez y faire grand-chose et nous non plus.

Ceci étant dit, sa réponse sur cette discussion ne me paraît pas véritablement insultante. Il est vrai qu'il est difficile de comprendre ce que vous souhaitez obtenir avec le schéma de table que vous proposez. Cependant, si j'ai bien compris, cela me donnerait cette requête :

SELECT agence, commune, sum(nb_forage) FROM maTable GROUP BY agence, commune;

Mais je n'y mettrais pas ma main au feu.


Guillaume.

Hors ligne

#5 05/02/2014 08:45:36

Re : [RESOLU] Aide sur une requête

Bonjour,


Merci pour ton avis... En fait j'aurais voulu idéalement récupérer le nombre de forages par agence, donc un tableau de résultats du genre :


agence     ⎪  nb_forage
-----------+-------------
  1        ⎪  23
  2        ⎪  7
  3        ⎪  2

Bon, je me dirige plus vers une séparation de mes jeux de données (forages d'un côté et réservoirs de l'autre)...


Thomas

Hors ligne

#6 05/02/2014 10:29:27

gleu
Administrateur

Re : [RESOLU] Aide sur une requête

Dans ce cas, votre première requête semble être bonne... mais vu le résultat présenté, le jeu de données indiqué est faux.

pour mieux vous aider, il faudrait qu'on parte des membres bases. même jeu de données,  identification des colonnes importantes, etc.


Guillaume.

Hors ligne

#7 05/02/2014 14:27:11

damalaan
Membre

Re : [RESOLU] Aide sur une requête

Bonjour,

En reprenant le jeu de données initial

 agence    |  commune         |  nb_forage    |  type_reservoir    |  nb_reservoir
------------+------------------+---------------+--------------------+----------------
  1         |  86001           |  2            |  01                |  1
  1         |  86002           |  3            |  01                |  1
  1         |  86002           |  3            |  02                |  2
  2         |  86003           |  1            |  01                |  3
  2         |  86003           |  1            |  01                |  3
  2         |  86004           |  0            |  02                |  3

et en s'attachant à l'agence 1 : cela signifie t il que
1-dans la commune 86002 il y a 3 forages avec des réservoirs de type 1 et 3 forages avec des réservoirs de type 2 soit 6 forages pour cette commune?
2- ou cela signifie que l'on a QUE 3 forages sur la commune 86002 avec 2 types de réservoirs? (dans ce cas il y a un souci de modélisation)?

Hors ligne

#8 05/02/2014 15:23:24

Re : [RESOLU] Aide sur une requête

Bonjour,


C'est le 2e scénario qui est bon ! Au passage, je n'ai rien modélisé du tout... Je travaille sur ce tableau que j'ai récupéré. Ma question était juste de savoir si je pouvais sortir ce type de résultat sans avoir à remanier mon tableau. Sinon, je me rends bien compte que la modélisation n'est pas bonne. Existe-t-il une clause associée à un SELECT qui permettrait de faire un regroupement des forages par agence en se basant sur une seule occurrence de chaque commune ?


Thomas

Hors ligne

#9 05/02/2014 15:49:40

damalaan
Membre

Re : [RESOLU] Aide sur une requête

en attendant vous pouvez essayer qqc comme ca

select agence, sum(nb_forage) 
from 
	(
	select distinct agence, commune, nb_forage 
	from test
	) a
group by agence;

ce qui renvoie :

agence;total forage/agence
1;5
2;1

La sous requete permet d'éliminer les doublons

Hors ligne

#10 05/02/2014 15:53:46

Re : [RESOLU] Aide sur une requête

Merci, je vais essayer ça !

Hors ligne

#11 06/02/2014 10:55:41

Re : [RESOLU] Aide sur une requête

Bonjour,


Test ce matin et ça fonctionne bien. Cela me permet de contourner le problème assez simplement même si je suis bien conscient que la modélisation est mauvaise...


Merci pour votre aide !


Thomas

Hors ligne

Pied de page des forums