Vous n'êtes pas identifié(e).
Pages : 1
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
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
Hors ligne
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
damien clochard
http://dalibo.org | http://dalibo.com
Hors ligne
Merci beaucoup, je ne connaisais pas
En attendant j'avais résolu le problème avec un CASE, mais là c'est quand même plus propre.
Hors ligne
Pages : 1