Débutant: remplacer un "null" par un "zero" ?

Débutant: remplacer un "null" par un "zero" ? - SQL/NoSQL - Programmation

Marsh Posté le 15-01-2005 à 16:38:32    

Sous Firebird 1.5, j'ai créé une vue, résultat d'un select avec jointure gauche entre une table "stock" avec tous les produits et une table "Ventes" avec uniquement les produits vendus. Je voudrais faire la somme entre les quantités vendues et celles en stock pour obtenir la quantité d'origine (avant vente) or la jointure implique des champs à "null" pour les produits jamais vendus et je ne sais pas comment transformer ces "null" en Zero (ou ne pas avoir ces "null" ) pour pouvoir calculer.
je débute et demande des pistes à ceux qui savent.
merci d'avance.

Reply

Marsh Posté le 15-01-2005 à 16:38:32   

Reply

Marsh Posté le 15-01-2005 à 19:30:17    

Il faut faire une jointure externe.
 
Je te laisse chercher dans google "jointure externe firebird" ;)

Reply

Marsh Posté le 15-01-2005 à 21:02:57    

la recherche donne: "Le (+) peut s'interpréter comme l'ajout d'une ligne fictive dont toutes les colonnes ont la valeur NULL, et qui réalise la correspondance avec les lignes de l'autre table qui n'ont pas de correspondant réel. Dans l'exemple cité, la valeur de nom associée au département 40 est la valeur NULL."
 
J'ai du mal m'exprimer car c'est exactement ce que j'ai fait mais mon probleme est que les produits qui n'ont pas de correspondance dans la table vente sont renvoyés avec "null" comme valeur de quantité vendue => pas de calcul possible sur une valeur "null" (il me faudrait 0 comme valeur).
merci tout de même.


Message édité par Gopherlechien le 15-01-2005 à 21:07:09
Reply

Marsh Posté le 15-01-2005 à 22:24:43    

Je te propose deux solutions, mais je ne promet pas que ce soit ce que tu attends.
 
Tu peux creer une table temporaire pour recevoir les données du select puis remplacer les NULL par des zeros.
 
Tu peux faire une jointure sur deux select (produit dans les deux tables et produit que dans stock) puis utiliser ISNULL() sur le deuxieme select.

Reply

Marsh Posté le 15-01-2005 à 23:03:55    

Sous Oracle tu aurais pu utiliser NVL (ou même DECODE).
Avec Firebird, il doit y avoir une fonction voisine.
 
edit : une piste ici :
 
http://www.destructor.de/firebird/1.5/whatsnew.htm
 
Je cite :
 

Citation :

New COALESCE internal function
Allow a column value to be calculated by a number of expressions, the first expression returning a non NULL value is returned as the column value. The function has the same meaning as NVL in Oracle.
 
Syntax:
 
        COALESCE (value {, value} ... )Notes:
 
COALESCE (V1, V2) is equivalent to the following case specification:
             CASE WHEN V1 IS NOT NULL THEN V1 ELSE V2 END  
COALESCE (V1, V2, ..., Vn), for n >= 3, is equivalent to the following case specification:
             CASE WHEN V1 IS NOT NULL THEN V1 ELSE COALESCE (V2, ..., Vn) END  
Example:
 
        SELECT
          PROJ_NAME AS Projectname,
          COALESCE(e.FULL_NAME, '[> not assigned <]') AS Employeename
        FROM
          PROJECT p LEFT JOIN EMPLOYEE e ON (e.EMP_NO = p.TEAM_LEADER)


Message édité par Beegee le 15-01-2005 à 23:06:34
Reply

Marsh Posté le 15-01-2005 à 23:13:50    

ISNULL ne fonctionne pas avec firebird, je vais approfondir COALESCE:
ça fonctionne du tonnerre!
Merci beaucoup à vous.


Message édité par Gopherlechien le 16-01-2005 à 08:45:30
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed