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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 115
    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
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 162
    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 162
    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...
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  3. #3
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 115
    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 Expert
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    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 confirmé
    Inscrit en
    Septembre 2007
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 115
    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
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 162
    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 162
    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).
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  7. #7
    Membre Expert 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
    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
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 162
    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 162
    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...)
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  9. #9
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 115
    Par défaut
    ça fonctionne mille merci david douillet !

    J'ai juste un question par rapport à ta requête.
    Comment faire pour limiter les champs.

    Exemple :

    table : kw // champs : categorie, souscar, ID
    table : problems // champs : solutionID, datecreation

    Voilà ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT k.categorie, k.souscat, COUNT(P.codegamme) AS Nb
    FROM kw k
    LEFT JOIN problems P
    	ON P.SolutionID = k.ID 
    	AND P.datecreation BETWEEN (CURRENT_DATE - INTERVAL '607' DAY) AND CURRENT_DATE
                    AND k.ID in (6725,6726,6727,6728,6729,6730)
    GROUP BY k.categorie, k.souscat
    ORDER BY k.categorie, k.souscat
    je souhaiterais n'afficher que les champs ID 6725,6726,6727,6728,6729,6730 même lorsqu'ils sont à zéro, mais pas les autres champs...

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

    commençons par ta question, matimat2k4. Si je l'ai bien comprise, tu veux filtrer les résultats en fonction d'un critère portant sur ta table "de gauche". Si c'est bien le cas, une solution simple pourrait être :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT k.categorie, k.souscat, COUNT(P.codegamme) AS Nb
    FROM kw k
    LEFT JOIN problems P
    	ON P.SolutionID = k.ID 
    	AND P.datecreation BETWEEN (CURRENT_DATE - INTERVAL '607' DAY) AND CURRENT_DATE
    WHERE k.ID IN (6725,6726,6727,6728,6729,6730)
    GROUP BY k.categorie, k.souscat
    ORDER BY k.categorie, k.souscat

    Bon, tout cela ne répond pas à la question de Yanika_bzh :
    Citation Envoyé par Yanika_bzh Voir le message
    J'aimerai juste savoir si la requete que j'ai postée permet de s'approcher au plus pres de la solution
    Dans la mesure où ce n'est pas moi qui exprimais le besoin initial, je ne suis peut-être pas le mieux placé pour répondre, mais je vais essayer. Etudions donc le jeu de test suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    gammes
    --------
    gamme libelle
    1     A
    2     B
    3     C
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    problems
    --------
    statut   datecloture codegamme
    clos     30/03/2008  1
    réouvert 30/03/2008  3
    et, pour mémoire, la requête que tu proposais :
    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
    Remarque : je pense que la virgule dans l'égalité a.status,='CLOS' est une coquille, je ne m'y attarderai donc pas.

    Si je ne me trompe pas, tu devrais constater que seule la gamme 1 apparaît dans les résultats. Etudions rapidement les raisons de l'absence des gammes 2 et 3 :

    - au sortir du LEFT JOIN, la gamme 2 de la table [gammes] n'a pu être mise en correspondance avec aucun enregistrement de la table [problems]. Le LEFT JOIN "génère" donc une ligne pour la gamme 2, mais dont toutes les colonnes issues de la table [problems] sont NULL. Ta clause WHERE va donc écarter cette ligne à cause du critère
    datecloture BETWEEN (CURRENT_DATE - INTERVAL '7' DAY) AND CURRENT_DATE
    La clause GROUP BY n'a donc plus aucune ligne relative à la gamme 2 à regrouper, et cette gamme est donc évincée des résultats.

    - venons en à la gamme 3 : suite au LEFT JOIN, la gamme 3 de la table [gammes] est mise en correspondance avec une (et une seule) ligne de la table [problems], ligne dont le [statut] est 'réouvert'. Puisque le [statut] de cette ligne n'est ni 'CLOS', ni 'NULL', ni NULL, elle est écartée par la clause WHERE que tu proposes, ce qui explique là aussi l'absence de la gamme 3 dans les résultats de ta requête.

    Voilà, j'espère que ça suffira à répondre à ta question, parce que présentement, mon estomac m'appelle !

    Bonne soirée !

  11. #11
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 162
    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 162
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par J1
    Le LEFT JOIN "génère"
    Soufflons un peu, car la requête en cause "génère" (soulève, provoque, suscite, déclenche...) quelques explications fort instructives mais pas toujours faciles à exposer de façon simple, n'en déplaise à Boileau.

    Or donc, petite parenthèse, que pensez-vous d'ôter les guillemets qui encadrent "génère" ? Certes, en français correct on doit écrire "engendre", mais dans le contexte du jargon du métier, je pense pour ma part que l'on doit pouvoir se permettre quelques licences, sans faire offense à la langue...
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  12. #12
    Membre Expert 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
    Par défaut
    Effectivement, ecrite a la va vite et sans possibilité de test, cette requete n'est pas fonctionnelle. Cependant, je parlais de l'approche du probleme (d'ou le "a adapter et tester")

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT 
           g.libelle,
           SUM(
                CASE  statut WHEN 'clos' then 
                                           1 
                                     ELSE 
                                           0 
                  END ) as "Nbre Clos"
    FROM gammes g LEFT OUTER JOIN problems a 
     ON (g.gamme=a.codegamme and datecloture between ... and ...)   
     WHERE
      (a.statut='clos') or  COALESCE(case a.statut when 'clos' then 'clos' else NULL end,'')='' 
    GROUP BY g.gamme

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

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, 10h04
  2. Réponses: 6
    Dernier message: 22/04/2008, 11h50
  3. Réponses: 2
    Dernier message: 27/02/2008, 18h45
  4. Réponses: 2
    Dernier message: 22/11/2006, 12h11
  5. Réponses: 6
    Dernier message: 11/01/2005, 12h49

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