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 01/06/2009 15:41:10

Totolens
Membre

Problème retour NULL au lieu de 0

Bonjour à tous,

J'ai un petit problème concernant le retour de vues.

Retourne la quantité du produit Id_produit vendu

CREATE VIEW produit_vendu (Id_produit, qte)
AS
SELECT p.Id_produit, SUM(pp.qte)
FROM produit p LEFT JOIN (produit_dans_panier pp RIGHT JOIN (commande c RIGHT JOIN panier pa ON pa.id_panier = c.id_panier ) ON c.id_panier = pp.id_panier ) ON p.Id_produit = pp.Id_produit
GROUP BY p.Id_produit;

Retourne la quantité du produit Id_produit recu

CREATE VIEW stock_recu (Id_produit, qte)
AS
SELECT p.Id_produit, SUM(a.qte)
FROM produit p LEFT JOIN approvisionnement a ON p.Id_produit = a.Id_produit WHERE a.recu = 1 GROUP BY p.Id_produit;

Retourne le stock courant du produit Id_produit

CREATE VIEW stock_courant (Id_produit, stock_courant, recu, vendu)
AS
SELECT p.Id_produit, (sr.qte - pv.qte), sr.qte, pv.qte
FROM produit p LEFT JOIN (stock_recu sr LEFT JOIN produit_vendu pv ON sr.Id_produit = pv.Id_produit) ON p.Id_produit = sr.Id_produit;

Mon problème se situe principalement au niveau de la vue produit_vendu qui me retourne une valeur nulle pour la quantité, alors que j'aimerais avoir un 0.
Cette valeur nulle pose un problème dans stock_courant, puisque l'opération sr.qte - pv.qte me retourne systématiquement NULL hmm

Je vous met les tables au cas où

CREATE TABLE stock (
Id_produit INTEGER PRIMARY KEY REFERENCES produit,
stock_recommande INTEGER NOT NULL,
stock_minimal INTEGER,
stock_maximal INTEGER NOT NULL,
);
CREATE TABLE approvisionnement (
Id_appro INTEGER PRIMARY KEY DEFAULT nextval('id_appro'),
Id_produit INTEGER NOT NULL REFERENCES Produit,
date_commande DATE NOT NULL DEFAULT CURRENT_DATE,
Qte INTEGER NOT NULL,
recu INTEGER NOT NULL DEFAULT 0);
CREATE TABLE Produit_dans_panier (
Id_panier INTEGER REFERENCES Panier,
Id_produit INTEGER REFERENCES Produit,
qte INTEGER NOT NULL,
prix FLOAT NOT NULL,
PRIMARY KEY (Id_panier, Id_produit)
);
CREATE TABLE Commande (
Id_commande INTEGER PRIMARY KEY DEFAULT nextval('id_commande'),
id_panier INTEGER REFERENCES Panier,
Id_client INTEGER REFERENCES Client,
id_lieu INTEGER REFERENCES Lieu_livraison,
Statut VARCHAR(20) NOT NULL,
Date_commande DATE NOT NULL
);

Merci d'avance smile

Hors ligne

#2 01/06/2009 17:59:00

daamien
damien clochard

Re : Problème retour NULL au lieu de 0

L'aggrégat SUM retourne NULL si aucune ligne n'est sélectionnée.

La fonction COALESCE est ton amie.

Dans ton cas :

...
SELECT p.Id_produit, COALESCE(SUM(pp.qte),0)
...

http://docs.postgresql.fr/8.4/functions-aggregate.html
http://docs.postgresql.fr/8.4/functions … ional.html

Hors ligne

#3 01/06/2009 21:52:26

Totolens
Membre

Re : Problème retour NULL au lieu de 0

Merci beaucoup, je ne connaisais pas smile

En attendant j'avais résolu le problème avec un CASE, mais là c'est quand même plus propre.

Hors ligne

Pied de page des forums