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

Langage SQL Discussion :

Problème d'addition à cause des NULL


Sujet :

Langage SQL

  1. #1
    Membre chevronné Avatar de Oluha
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 183
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 183
    Points : 1 967
    Points
    1 967
    Par défaut Problème d'addition à cause des NULL
    Bonjour

    Je fais une requête SQL afin d'éditer des statistiques par département.
    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
    18
    19
    20
    21
    22
    23
    SELECT substring(A.DEP, 1, 2) AS DEPT, A.LF, B.LCP, C.LD, D.LTF, (A.LF + B.LCP + C.LD + D.LTF) AS TOTAL
    FROM (SELECT DEP, COUNT(*) AS LF
          FROM TABTRAV
          WHERE (TYPELIASSE = 1)
          GROUP BY DEP) A 
    LEFT OUTER JOIN
          (SELECT DEP, COUNT(*) AS LCP
          FROM TABTRAV
          WHERE (TYPELIASSE = 2 OR TYPELIASSE = 3)
          GROUP BY DEP) B
    ON A.DEP = B.DEP
    LEFT OUTER JOIN
          (SELECT DEP, COUNT(*) AS LD
          FROM TABTRAV
          WHERE (TYPELIASSE = 4 OR TYPELIASSE = 5 OR TYPELIASSE = 6)
          GROUP BY DEP) C
    ON A.DEP = C.DEP
    LEFT OUTER JOIN
          (SELECT DEP, COUNT(*) AS LTF
          FROM TABTRAV
          WHERE (TYPELIASSE = 7)
          GROUP BY DEP) D
    ON A.DEP = D.DEP
    Le problème c'est que ma requête me renvoie des NULL au lieu de 0 et du coup ma colonne TOTAL ne fonctionne pas...

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    22	20191	7114	NULL	NULL	NULL
    29	22427	7592	NULL	NULL	NULL
    35	85511	17899	NULL	2	NULL
    56	17631	3743	NULL	NULL	NULL
    Les null ne me dérange pas dans les colonnes Lxxx (2 à 5) même au contraire, à l'impression j'aurai du vide, mais j'aimerai que le calcul du total puisse fonctionner.
    Comment faire ?

    Merci

  2. #2
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    En fonction de ton SGBD tu peux faire un COALESCE (standard SQL), un NVL (ORACLE)... qui va te permettre de transformer les NULL en 0

  3. #3
    Membre chevronné Avatar de Oluha
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 183
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 183
    Points : 1 967
    Points
    1 967
    Par défaut
    ben en fait j'ai ajouté des CASE, c'est moche mais ca marche

    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
    18
    19
    20
    21
    22
    23
    24
    SELECT substring(A.DEP, 1, 2) AS DEPT, A.LF, B.LCP, C.LD, D.LTF, 
    ((case when A.LF is null then 0 else A.LF end) + (case when B.LCP is null then 0 else B.LCP end) + (case when C.LD is null then 0 else C.LD end) + (case when D.LTF is null then 0 else D.LTF end)) AS TOTAL
    FROM (SELECT DEP, COUNT(*) AS LF
          FROM TABTRAV
          WHERE (TYPELIASSE = 1)
          GROUP BY DEP) A 
    LEFT OUTER JOIN
          (SELECT DEP, COUNT(*) AS LCP
          FROM TABTRAV
          WHERE (TYPELIASSE = 2 OR TYPELIASSE = 3)
          GROUP BY DEP) B
    ON A.DEP = B.DEP
    LEFT OUTER JOIN
          (SELECT DEP, COUNT(*) AS LD
          FROM TABTRAV
          WHERE (TYPELIASSE = 4 OR TYPELIASSE = 5 OR TYPELIASSE = 6)
          GROUP BY DEP) C
    ON A.DEP = C.DEP
    LEFT OUTER JOIN
          (SELECT DEP, COUNT(*) AS LTF
          FROM TABTRAV
          WHERE (TYPELIASSE = 7)
          GROUP BY DEP) D
    ON A.DEP = D.DEP
    j'ai regardé dans l'aide (je suis avec SQL SERVER) la fonction COALESCE, mais il me dit que ca renvoie la 1ere expression non nulle parmis les arguments, j'ai pas trop capté

  4. #4
    Membre actif Avatar de TheRussian
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 200
    Points : 241
    Points
    241
    Par défaut
    Bojour,

    A ma connaissance coalesce fonctionne comme ca :

    coalesce(arg1,arg2), renvoie arg2 si arg1 et NULL

  5. #5
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT COALESCE(B.LCP, 0)...
    SI B.LCP n'est pas null, il prend cette valeur, sinon, si 0 n'est pas Null il prend 0 (et 0 n'est pas null , c'est ce qu'il fait)

    Dans le cas général tu peux faire un truc du genre COALESCE (A, B, C, 2)

    Si A n'est pas Null il ramène A
    Si A est null
    Si B n'est pas Null il ramène B
    Si B est Null
    Si C n'est pas null il ramène C
    Si C est null il ramène 2

  6. #6
    En attente de confirmation mail Avatar de fred777888999
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    250
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 250
    Points : 292
    Points
    292
    Par défaut
    La gestion des null depends de ton SGBD...
    En oracle pour donner une valeur quand c'est null, c'est nvl, en sqlserveur c'est isnull. Ca se fait comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select (nvl(truc,0))
    si tu veux que la valeur soit 0 quand truc est null, poste dans la bonne categorie si tu n'as ni oracle ni sqlserveur....

  7. #7
    Membre chevronné Avatar de Oluha
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 183
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 183
    Points : 1 967
    Points
    1 967
    Par défaut
    Merci, j'ai pu rendre ma requête plus propre grace à la fonction COALESCE comme vous me l'avez recommandé. Super !

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

Discussions similaires

  1. Problème d'arrondi à cause des entiers
    Par zuzuu dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 11/12/2007, 18h02
  2. Réponses: 42
    Dernier message: 04/08/2006, 23h36
  3. #include bidirectionnel cause des problèmes
    Par matrox dans le forum C++
    Réponses: 4
    Dernier message: 21/06/2006, 16h46
  4. [VB6]Problème dajout dans une Table Access à cause des group
    Par bb62 dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 01/02/2006, 10h06
  5. Problème de "select" avec des valeurs a null
    Par SchpatziBreizh dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 01/07/2005, 16h08

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