Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/09/2004, 08h08   #1
Invité de passage
 
Inscription : février 2003
Messages : 14
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 14
Points : 4
Points : 4
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 :
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
Snowballz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2004, 09h19   #2
Membre émérite
 
Avatar de hpalpha
 
Inscription : mars 2002
Messages : 770
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 770
Points : 833
Points : 833
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 :
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;
hpalpha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2004, 09h23   #3
Membre émérite
 
Avatar de hpalpha
 
Inscription : mars 2002
Messages : 770
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 770
Points : 833
Points : 833
Tu peux eventuellement (mais ce n'est pas conseillé dans ce cas ) utiliser les CASE

Code :
1
2
 
CASE WHEN monchamp IS NULL THEN 0 ELSE monchamp END
hpalpha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2004, 10h03   #4
Invité de passage
 
Inscription : février 2003
Messages : 14
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 14
Points : 4
Points : 4
Merci pour ces 2 reponses mais aucune ne fonctionne
Snowballz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2004, 11h05   #5
Membre émérite
 
Avatar de hpalpha
 
Inscription : mars 2002
Messages : 770
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 770
Points : 833
Points : 833
Ok, je crois avoir trouvé, je n'avais pas fait attention a tes vues, essaye ce groupe de requete

Code :
1
2
3
 
CREATE VIEW qtereserv AS 
SELECT idarticle, SUM(COALESCE(qtereserv,0)) AS qteres FROM reservation GROUP BY idarticle;
Code :
1
2
3
 
CREATE VIEW qtecomm AS 
SELECT idarticle, SUM(COALESCE(qtecomm,0))  AS qtecom FROM detail_commande GROUP BY idarticle;
Code :
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;
hpalpha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2004, 11h21   #6
Invité de passage
 
Inscription : février 2003
Messages : 14
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 14
Points : 4
Points : 4
Si je fais :
Code :
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.
Snowballz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2004, 11h42   #7
Membre émérite
 
Avatar de hpalpha
 
Inscription : mars 2002
Messages : 770
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 770
Points : 833
Points : 833
Dans tes tables qtereserv, qtecomm as tu des valeurs qui sont a NULL ?
hpalpha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2004, 11h50   #8
Invité de passage
 
Inscription : février 2003
Messages : 14
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 14
Points : 4
Points : 4
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.
Snowballz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2004, 12h06   #9
Membre émérite
 
Avatar de hpalpha
 
Inscription : mars 2002
Messages : 770
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 770
Points : 833
Points : 833
Humm, effectivement ça peut aider, à mon avis, il va falloir voir du coté de la jointure (faire du OUTER JOIN)...
hpalpha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2004, 18h48   #10
Invité de passage
 
Inscription : février 2003
Messages : 14
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 14
Points : 4
Points : 4
Merci pour l'aide j'ai enfin trouvé.
Voici le code :
Code :
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
Snowballz est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h27.


 
 
 
 
Partenaires

Hébergement Web