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 :

Comment afficher les lignes lorsque la valeur est vide ?


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 115
    Points : 56
    Points
    56
    Par défaut Comment afficher les lignes lorsque la valeur est vide ?
    Bonjour,

    Je suis sur Nexus DB2.
    Je souhaite faire des statistiques sur le nombre d'incidents fermés.
    Pour cela, je passe la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT  libelle, count(*)
    FROM problems p right outer join Gammes g on p.CodeGamme = g.Gamme
    where statut = 'CLOS'
    and datecloture between (CURRENT_DATE - INTERVAL '7' DAY) and CURRENT_DATE
    GROUP BY libelle
    ORDER BY libelle
    Problème: les champs à zéro ne s'affichent pas. J'ai beau faire un left outer join ou right outer join je n'ai pas les champs à 0

    Exemple : j'ai les CodeGamme G1 - G2 - G3 - G4
    La valeur de ces champs est G1 = 1; G2 = 1; G3 = 9; G4 = 0
    Si je passe ma requête, je n'ai que les champs G1, G2 et G3 qui vont ressortir mais il me faudrait également le G4.

    Merci d'avance !

  2. #2
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 127
    Points : 31 667
    Points
    31 667
    Billets dans le blog
    16
    Par défaut
    Peut-être quelque chose comme :

    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
    SELECT  libelle, count(*)
    FROM problems p Inner JOIN Gammes g ON p.CodeGamme = g.Gamme
    WHERE statut = 'clos'
    AND datecloture BETWEEN (CURRENT_DATE - INTERVAL '7' DAY) AND CURRENT_DATE
    GROUP BY libelle
    Union All
    SELECT  libelle, count(*)
    from problems p
    WHERE statut = 'clos'
    AND datecloture BETWEEN (CURRENT_DATE - INTERVAL '7' DAY) AND CURRENT_DATE
    And not exists 
        (select   *
         from     Gammes g
         where    p.CodeGamme = g.Gamme)
    GROUP BY libelle
    ORDER BY libelle
    Remplacement d'un Outer join par un Inner Join Union avec le complément.

    A vérifier...

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 115
    Points : 56
    Points
    56
    Par défaut
    Non ça ne marche pas j'ai le message d'erreur ci-dessous :




    Le champ libelle appartient à la table GAMMES.

  4. #4
    say
    say est déconnecté
    Membre éprouvé
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Points : 1 258
    Points
    1 258
    Par défaut
    Citation Envoyé par matimat2k4 Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT  libelle, count(*)
    FROM problems p right outer join Gammes g on p.CodeGamme = g.Gamme
    where statut = 'CLOS'
    and datecloture between (CURRENT_DATE - INTERVAL '7' DAY) and CURRENT_DATE
    GROUP BY libelle
    ORDER BY libelle
    j'imagine que statut appartient à problems...
    EDIT : et dateclosure?
    essaies ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT  libelle, count(*)
    FROM problems p right outer join Gammes g on p.CodeGamme = g.Gamme
    where (statut = 'CLOS'
    and datecloture between (CURRENT_DATE - INTERVAL '7' DAY) and CURRENT_DATE) OR (statut IS NULL)
    GROUP BY libelle
    ORDER BY libelle
    comme tu mets une condition sur la table de droite (problemes), ton RIGHT OU LEFT reviens à faire un INNER, puisque que tu ne prends que les enregistrements respectant cette condition

  5. #5
    Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 115
    Points : 56
    Points
    56
    Par défaut
    oui en fait de la table gammes je ne récupère que les champs libelle et gamme.

    Tout le reste est de la table problems.

    Justement je n'arrive pas à me de condition sur la table Gammes pour tout faire apparaître...

  6. #6
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 127
    Points : 31 667
    Points
    31 667
    Billets dans le blog
    16
    Par défaut
    C’est la moindre des choses de présenter la structure des tables, ou à tout le moins de coder "g.libelle" plutôt que "libelle", on perdrait moins de temps.
    Cela dit, continuez avec l’UNION. Je ne sais pas si ce qui suit correspond à ce que vous attendez, mais c’est un essai pour aller dans votre sens, pour récupérer les gammes qui n’apparaissent pas après jointure.

    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
    SELECT  g.libelle, count(*)
    FROM problems p INNER JOIN Gammes g ON p.CodeGamme = g.Gamme
    WHERE p.statut = 'clos'
    AND p.datecloture BETWEEN (CURRENT_DATE - INTERVAL '7' DAY) AND CURRENT_DATE
    GROUP BY g.libelle
    UNION ALL
    SELECT  distinct g.libelle, count(*)
    from gammes g
    WHERE NOT EXISTS 
        (SELECT   *
         from    Problems p
         where   p.CodeGamme = g.Gamme
         and     p.statut = 'clos'
         and     p.datecloture  BETWEEN  (CURRENT_DATE - INTERVAL '7' DAY) AND CURRENT_DATE)
    GROUP BY g.libelle
    ORDER BY g.libelle
    N.B. Le Group by et le Count de la 2e partie de la requête ne sont pas indispensables (Count = 1).

  7. #7
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Dans votre cas,une jointure ouverte gauche fonctionnerait :

    Le resultat d'une LEFT OUTER JOIN d'une table A avec B contient tous les tuples de la table "gauche" A meme si les conditions de jointures ne trouvent pas de concordances avec la table "droite" B. Cela signifie que si la clause ON ne trouve aucun tuple dans B, la jointure renverra une ligne NULL dans les resultats et ce dans toutes les colonnes de B.

    Une requete du type
    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
     
    SELECT 
           g.libelle,
           SUM(
                CASE  status WHEN 'CLOS' then 
                                           1 
                                     ELSE 
                                           0 
                  END )
    FROM gammes g LEFT OUTER JOIN PROBLEM a 
     ON (g.gamme=a.CodeGamme) 
    WHERE
       (a.status,='CLOS'  or COALESCE(a.status,'NULL')='NULL')
        AND
        datecloture BETWEEN (CURRENT_DATE - INTERVAL '7' DAY) AND CURRENT_DATE 
    GROUP by g.libelle
    devrait vous aider a vous rapprocher du resultat, a tester et adapter selon vos criteres et votre modele.

    Bon courage

  8. #8
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 127
    Points : 31 667
    Points
    31 667
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par Yanika_bzh
    Une requete du type
    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
    SELECT 
           g.libelle,
           SUM(
                CASE  STATUS WHEN 'CLOS' then 
                                           1 
                                     ELSE 
                                           0 
                  END )
    FROM gammes g LEFT OUTER JOIN PROBLEM a 
     ON (g.gamme=a.CodeGamme) 
    WHERE
       (a.STATUS,='CLOS'  OR COALESCE(a.STATUS,'NULL')='NULL')
        AND
        datecloture BETWEEN (CURRENT_DATE - INTERVAL '7' DAY) AND CURRENT_DATE 
    GROUP BY g.libelle
    devrait vous aider a vous rapprocher du resultat, a tester et adapter selon vos criteres et votre modele.
    Sauf que le GROUP BY continuera impertubablement à filtrer plus qu'on ne voudrait (enfin c'est ce que je pense...)

  9. #9
    say
    say est déconnecté
    Membre éprouvé
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Points : 1 258
    Points
    1 258
    Par défaut
    Citation Envoyé par Yanika_bzh Voir le message

    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
     
    SELECT 
           g.libelle,
           SUM(
                CASE  status WHEN 'CLOS' then 
                                           1 
                                     ELSE 
                                           0 
                  END )
    FROM gammes g LEFT OUTER JOIN PROBLEM a 
     ON (g.gamme=a.CodeGamme) 
    WHERE
       (a.status,='CLOS'  or COALESCE(a.status,'NULL')='NULL')
        AND
        datecloture BETWEEN (CURRENT_DATE - INTERVAL '7' DAY) AND CURRENT_DATE 
    GROUP by g.libelle
    mais datecloture appartenant à problems, on a tjrs une condition sur la table de droite..c'est pourquoi j'ai proposé le IS NULL ailleurs...

    Citation Envoyé par fsmrel Voir le message
    Sauf que le GROUP BY continuera impertubablement à filtrer plus qu'on ne voudrait (enfin c'est ce que je pense...)
    pourquoi? le GROUP BY ne filtre rien...il regroupe ce qu'il lui est renvoyé...

  10. #10
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 127
    Points : 31 667
    Points
    31 667
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par say
    pourquoi? le GROUP BY ne filtre rien...il regroupe ce qu'il lui est renvoyé...
    On est bien d'accord, mais on peut voir les choses ainsi :

    D’un point de vue logique, la clause FROM est traitée en premier. Elle va produire un résultat.

    La clause WHERE est traitée en deuxième. Supposons qu’elle ne conserve rien (du fait par exemple du prédicat datecloture BETWEEN (CURRENT_DATE - INTERVAL '7' DAY) AND CURRENT_DATE).

    La clause GROUP BY est traitée en troisième : elle n’a rien à grouper.

    La clause SELECT est enfin traitée : il n’y a rien à restituer.

  11. #11
    say
    say est déconnecté
    Membre éprouvé
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Points : 1 258
    Points
    1 258
    Par défaut
    bah justement alors...
    en quoi le GROUP BY filtrera inlassablement...?

    enfin..on sait tjrs pas si cela répond au problème tout ça

  12. #12
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 127
    Points : 31 667
    Points
    31 667
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par say
    en quoi le GROUP BY filtrera inlassablement...?
    Ça n'est pas lui qui filtre, c'est le WHERE...
    Il peut donc se trouver dans la situation où le WHERE n'a rien à lui transmettre.

  13. #13
    say
    say est déconnecté
    Membre éprouvé
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Points : 1 258
    Points
    1 258
    Par défaut
    Citation Envoyé par fsmrel Voir le message
    Sauf que le GROUP BY continuera impertubablement à filtrer plus qu'on ne voudrait (enfin c'est ce que je pense...)
    Citation Envoyé par fsmrel Voir le message
    Ça n'est pas lui qui filtre, c'est le WHERE...
    Il peut donc se trouver dans la situation où le WHERE n'a rien à lui transmettre.

    euh...je suis plus...
    on est donc d'accord...que le GROUP BY n'a rien à voir la dedans..

  14. #14
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 127
    Points : 31 667
    Points
    31 667
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par say
    on est donc d'accord...
    On est d'accord. Maintenant, j'espère que matimat2k4 arrivera à faire la part des choses, car une chatte finirait bien par n'y plus retrouver ses chatons...

  15. #15
    J1
    J1 est déconnecté
    Membre averti Avatar de J1
    Inscrit en
    Mai 2004
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 321
    Points : 335
    Points
    335
    Par défaut
    Bonsoir,

    comme cela a été dit plus haut, il aurait franchement été plus simple que tu postes également le MCD de tes 2 tables, matimat2k4.
    Bon, admettons que ton MCD soit le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    gammes
    --------
    gamme (PK)
    libelle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    problems
    --------
    statut
    datecloture
    codegamme (FK)
    On peut passer par une jointure externe, en incluant tous les critères dans la condition de jointure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT G.libelle, COUNT(P.codegamme) AS Nb
    FROM gammes G
    LEFT JOIN problems P
    	ON P.codegamme = G.gamme 
    	AND P.statut='CLOS' 
    	AND P.datecloture BETWEEN (CURRENT_DATE - INTERVAL '7' DAY) AND CURRENT_DATE
    GROUP BY G.libelle
    ORDER BY G.libelle

    Peut-être moins performante (cela dépend du SGBD), mais aussi plus intuitive, une solution en sous-requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT libelle, (
    	SELECT COUNT(*)
    	FROM problems
    	WHERE codegamme=G.gamme
    	AND statut='CLOS'
    	AND datecloture BETWEEN (CURRENT_DATE - INTERVAL '7' DAY) AND CURRENT_DATE) AS Nb
    FROM gammes G
    ORDER BY libelle
    Le tout en espérant que tu as une contrainte d'unicité sur le champ [gammes].[libelle], c'est-à-dire que 2 enregistrements de la table [gammes] ne peuvent pas avoir le même [libelle], sans quoi la statistique générée risque de toute façon de ne pas être très pertinente.

  16. #16
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 127
    Points : 31 667
    Points
    31 667
    Billets dans le blog
    16
    Par défaut
    Appréciez, matimat2k4, vous avez les solutions de J1, qui est à SQL ce que David Douillet est au judo, tant au niveau de la compétence que de l'élégance, de la patience et de la bienveillance.

  17. #17
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Je ne comprends pas l'acharnement d'un count(*() (ou 1) sur une jointure externe gauche qui ramenera fatalement 1 (a cause de la relation gauche)

    mais bon , peut etre ai je n'est pas compris le probleme

    Bon courage

  18. #18
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Citation Envoyé par say Voir le message
    bah justement alors...
    en quoi le GROUP BY filtrera inlassablement...?

    enfin..on sait tjrs pas si cela répond au problème tout ça
    exactement !!

    mais je pense que cela repond au probleme, sauf si bien sur NULL est utilisé dans le status d'un probleme !

    voila ce que je pense, mais bon a cette heure, peut etre que mon esprit est altéré

    J'aimerai juste savoir si la requete que j'ai postée permet de s'approcher au plus pres de la solution

  19. #19
    say
    say est déconnecté
    Membre éprouvé
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Points : 1 258
    Points
    1 258
    Par défaut
    c'est vrai qu'on s'acharne..mais l'intéressé est en week-end...
    je pense que nous avons ici plusieurs solutions fonctionnelles...

    a suivre maintenant

  20. #20
    Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 115
    Points : 56
    Points
    56
    Par défaut
    Merci beaucoup pour vos réponses...
    Non je ne suis pas en week-end mais j'ai de nombreuses personnes sur le programme donc j'évite de passer des requêtes la dernière fois j'ai flingué les bases de données...
    Réponse demain après-midi...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [AC-2007] Requête COUNT - afficher les lignes dont le compte est null
    Par Tchebichef dans le forum Requêtes et SQL.
    Réponses: 17
    Dernier message: 10/09/2012, 11h04
  2. Réponses: 6
    Dernier message: 22/04/2008, 12h50
  3. Réponses: 2
    Dernier message: 27/02/2008, 19h45
  4. Réponses: 2
    Dernier message: 22/11/2006, 13h11
  5. Réponses: 6
    Dernier message: 11/01/2005, 13h49

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