IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PostgreSQL Discussion :

[SUM] récuperer une quantite a partir de plusieurs table


Sujet :

PostgreSQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 14
    Points : 9
    Points
    9
    Par défaut [SUM] récuperer une quantite a partir de plusieurs table
    Bonjour,

    J'ai une DB avec les tables:
    - article (idarticle, quantitestock, qteabime)
    - reservation (idarticle, qtereserv)
    - commande (idcomm)
    - detail_commande (idarticle, idcomm, qtecomm).
    Je voudrais pouvoir calculer le nombre d'article que j'ai en stock avec la formule: quantiteenstock - qteabime - qtereserv + qtecomm.
    Le probleme que je rencontre c'est si un article n'a pas ete commande ou reserve. PostgreSQL ne le considere pas à 0.
    Voilà un exemple de code que j'ai essayé sans resultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    /*==============================================================*/
    /* Vue : quantite reservee                                      */
    /*==============================================================*/
    create view qtereserv as
    select idarticle, sum(qtereserv) from reservation group by idarticle;
     
    /*==============================================================*/
    /* Vue : quantite commandee                                       */
    /*==============================================================*/
    create view qtecomm as
    select idarticle, sum(qtecomm) from detail_commande group by idarticle;
     
    /*==============================================================*/
    /* Vue : quantite en stock                                      */
    /*==============================================================*/
    create view qtestock as
    select article.idarticle, article.quantitestock - article.qteabime + article.qteentrop - qtereserv.sum + qtecomm.sum from article, qtereserv, qtecomm where article.idarticle = qtereserv.idarticle AND qtecomm.idarticle = article.idarticle;
    Si qqun peut m'aider
    Merci

  2. #2
    Membre émérite
    Avatar de hpalpha
    Inscrit en
    Mars 2002
    Messages
    769
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 769
    Points : 2 545
    Points
    2 545
    Par défaut
    En fait, c'est le probleme de la valeur NULL : NULL + nimportequelnombre donne un resultat indeterminé.


    Utilise Coalesce pour retourner la premiere valeur non nulle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select article.idarticle, Coalesce(article.quantitestock,0) - Coalesce(article.qteabime,0) + Coalesce(article.qteentrop,0) - Coalesce(qtereserv.sum,0) + Coalesce(qtecomm.sum,0) from article, qtereserv, qtecomm where article.idarticle = qtereserv.idarticle AND qtecomm.idarticle = article.idarticle;
    Delphi 2009 - ZeosLib - DevExpress - TMS - PgDAC
    PostgreSQL 8.4 sous Debian
    Sites : http://postgresql.developpez.com http://dgriessinger.developpez.com

  3. #3
    Membre émérite
    Avatar de hpalpha
    Inscrit en
    Mars 2002
    Messages
    769
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 769
    Points : 2 545
    Points
    2 545
    Par défaut
    Tu peux eventuellement (mais ce n'est pas conseillé dans ce cas ) utiliser les CASE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CASE WHEN monchamp IS NULL THEN 0 ELSE monchamp END
    Delphi 2009 - ZeosLib - DevExpress - TMS - PgDAC
    PostgreSQL 8.4 sous Debian
    Sites : http://postgresql.developpez.com http://dgriessinger.developpez.com

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 14
    Points : 9
    Points
    9
    Par défaut
    Merci pour ces 2 reponses mais aucune ne fonctionne

  5. #5
    Membre émérite
    Avatar de hpalpha
    Inscrit en
    Mars 2002
    Messages
    769
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 769
    Points : 2 545
    Points
    2 545
    Par défaut
    Ok, je crois avoir trouvé, je n'avais pas fait attention a tes vues, essaye ce groupe de requete

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CREATE VIEW qtereserv AS 
    SELECT idarticle, SUM(COALESCE(qtereserv,0)) AS qteres FROM reservation GROUP BY idarticle;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CREATE VIEW qtecomm AS 
    SELECT idarticle, SUM(COALESCE(qtecomm,0))  AS qtecom FROM detail_commande GROUP BY idarticle;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT article.idarticle, COALESCE(article.quantitestock,0) - COALESCE(article.qteabime,0) + COALESCE(article.qteentrop,0) - qtereserv.qteres + qtecomm.qtecom FROM article, qtereserv, qtecomm WHERE article.idarticle = qtereserv.idarticle AND qtecomm.idarticle = article.idarticle;
    Delphi 2009 - ZeosLib - DevExpress - TMS - PgDAC
    PostgreSQL 8.4 sous Debian
    Sites : http://postgresql.developpez.com http://dgriessinger.developpez.com

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 14
    Points : 9
    Points
    9
    Par défaut
    Si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM qtereserv;
    ou
    je n'obtiens que les valeurs qui sont entrees dans ces tables donc en appelant qtereserv.qteres ou qtecomm.qtecom ca pose toujours le meme probleme.

  7. #7
    Membre émérite
    Avatar de hpalpha
    Inscrit en
    Mars 2002
    Messages
    769
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 769
    Points : 2 545
    Points
    2 545
    Par défaut
    Dans tes tables qtereserv, qtecomm as tu des valeurs qui sont a NULL ?
    Delphi 2009 - ZeosLib - DevExpress - TMS - PgDAC
    PostgreSQL 8.4 sous Debian
    Sites : http://postgresql.developpez.com http://dgriessinger.developpez.com

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 14
    Points : 9
    Points
    9
    Par défaut
    non, elles ne sont pas encore initialisees.
    je voudrais pouvoir faire le calcul, par exemple, si un article est réservé mais pas commandé. Donc dans detail_commande, idarticle n'y sera pas.
    Peut être aurai-je dû expliquer ca en commençant.

  9. #9
    Membre émérite
    Avatar de hpalpha
    Inscrit en
    Mars 2002
    Messages
    769
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 769
    Points : 2 545
    Points
    2 545
    Par défaut
    Humm, effectivement ça peut aider, à mon avis, il va falloir voir du coté de la jointure (faire du OUTER JOIN)...
    Delphi 2009 - ZeosLib - DevExpress - TMS - PgDAC
    PostgreSQL 8.4 sous Debian
    Sites : http://postgresql.developpez.com http://dgriessinger.developpez.com

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 14
    Points : 9
    Points
    9
    Par défaut
    Merci pour l'aide j'ai enfin trouvé.
    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT article.idarticle, article.quantitestock - article.qteabime + article.qteentrop - coalesce(reservation.qtereserv,0) + coalesce(detail_commande.qtecomm,0) FROM article 
    LEFT OUTER JOIN reservation ON reservation.idarticle = article.idarticle
    LEFT OUTER JOIN detail_commande ON detail_commande.idarticle = article.idarticle;
    A inserer dans une vue pour pouvoir l'utiliser comme je veux par la suite.

    Un grand merci hpalpha

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Trigger et calcul d'une valeur à partir de plusieures tables
    Par tomasi dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 31/07/2008, 16h55
  2. Réponses: 7
    Dernier message: 12/06/2008, 13h26
  3. [Smarty] Récuper une variable php à partir d'une variable Smarty
    Par SPKlls dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 23/04/2008, 17h40
  4. Réponses: 8
    Dernier message: 10/09/2007, 11h19
  5. Réponses: 3
    Dernier message: 17/03/2007, 00h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo