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

SQL Firebird Discussion :

Requête GROUP BY inclure les résultats NULL


Sujet :

SQL Firebird

  1. #1
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut Requête GROUP BY inclure les résultats NULL
    Bonjour,

    Voilà mon souci, j'ai une requête qui fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SELECT 
      GROUPE.SIGLEGROUPE,
      Sum(PRODUCTION.STHTPRODUIT) AS CUMULPRODUCTION
    FROM
      AFFAIRE
      INNER JOIN DEVIS ON (AFFAIRE.CODEAFFAIRE = DEVIS.CODEAFFAIRE)
      INNER JOIN PRODUCTION ON (DEVIS.CODEDEVIS = PRODUCTION.CODEDEVIS)
      INNER JOIN GROUPE ON (PRODUCTION.CODEGROUPE = GROUPE.CODEGROUPE)
    WHERE
      AN =:REFAN AND 
      MOIS =:CHMOIS
    GROUP BY
      GROUPE.SIGLEGROUPE
    La table GROUPE comporte 10 enregistrements et seuls ceux disposant de chiffres apparaissent dans le résultat.
    Normal me direz-vous..

    Mais je souhaiterais néamoins que ceux qui ne sont pas représentés s'affichent quand même mais avec 0 dans la colonne CUMULPRODUCTION.

    J'ai bien tenté de forcer la jointure et d'écrire quelque chose de ce genre :
    COALESCE (Sum(PRODUCTION.STHTPRODUIT), 0) as CUMULPRODUCTION

    mais ça ne marche pas...

    Auriez-vous une solution à me proposer ?

    cantador

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 17
    Points : 17
    Points
    17
    Par défaut
    je dirais qu'il faut que tu utilise LEFT OUTER JOIN pour avoir tous les résultats.

    ce que je trouve bizzare c'est que tu fasses :
    affaire->devis->production->groupe

    alors que tu veux tous les groupes....

    moi je ferai
    groupe->production->devis->affaire

    du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT 
      GROUPE.SIGLEGROUPE,
      Sum(PRODUCTION.STHTPRODUIT) AS CUMULPRODUCTION
    FROM
      GROUPE
      LEFT OUTER JOIN PRODUCTION ON ...
      LEFT OUTER JOIN DEVIS ON ...
      LEFT OUTER JOIN AFFAIRE ON ...
    ...
    ou alors j'ai rien compris ...

  3. #3
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    Bonsoir,

    heu oui effectivement il y des tables qui ne servent à rien :

    cela donne après rectification :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT 
      GROUPE.SIGLEGROUPE,
      Sum(PRODUCTION.STHTPRODUIT) AS CUMULPRODUCTION
    FROM
      PRODUCTION
      LEFT OUTER JOIN GROUPE ON (PRODUCTION.CODEGROUPE = GROUPE.CODEGROUPE)
    WHERE
      AN =:REFAN AND
      MOIS =:CHMOIS
    GROUP BY
      GROUPE.SIGLEGROUPE

    Mais ça ne règle pas mon problème car le résultat n'affiche que les groupes qui ont de la production..

    Ceux qui n'en n'ont pas ne sont pas présents alors que moi je voudrais TOUS les voir avec CUMULPRODUCTION = 0 pour ceux dont la production est nulle.

    et je voudrais aussi éviter l'introduction de zéro dans les tables...

    ???

    cantador

  4. #4
    Membre expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Points : 3 712
    Points
    3 712
    Par défaut
    à quelle table appartiennent les champs ANN et MOIS ?
    Philippe Makowski
    IBPhoenix - Firebird
    Membre de l'April

  5. #5
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    bonsoir makowski,

    les champs AN et MOIS appartiennent à la table production.

    j'ai tenté aussi ça mais sans résultat...

    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
    25
    26
    27
    28
    29
    30
    31
     
    SELECT 
      GROUPE.SIGLEGROUPE,
     
      CASE
     
      WHEN
     
      Sum(PRODUCTION.STHTPRODUIT) IS NULL THEN
     
      0
     
      ELSE
     
      Sum(PRODUCTION.STHTPRODUIT) 
     
      END
     
      CUMULPRODUCTION
     
    FROM
      PRODUCTION
      LEFT OUTER JOIN GROUPE
      ON (PRODUCTION.CODEGROUPE = GROUPE.CODEGROUPE)
     
    WHERE
      AN =:REFAN AND
      MOIS =:CHMOIS
     
    GROUP BY
      GROUPE.SIGLEGROUPE
    merci par avance

    cantador

  6. #6
    Membre expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Points : 3 712
    Points
    3 712
    Par défaut
    Citation Envoyé par cantador Voir le message
    bonsoir makowski,

    les champs AN et MOIS appartiennent à la table production.
    Avant d'aller plus loin, ça existe des enregistrement dans PRODUCTION avec des valeurs pour ANN et MOIS mais avec des NULL pour STHTPRODUIT ?
    autrement dis que cherches tu vraiment à retrouver ?
    tous les GROUPE.SIGLEGROUPE avec ???
    Philippe Makowski
    IBPhoenix - Firebird
    Membre de l'April

  7. #7
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    oui effectivement, il y a des groupes qui n'ont pas de production certains mois.

    Mais dans ce cas, il n'y a rien, ni 0, ni null, ni même un blanc.

    et ce que je voudrais c'est par exemple :

    groupe1 0
    groupe2 587 432
    groupe3 1 456 567
    groupe4 0
    groupe5 888 421
    groupe6 0

    ?
    cantador

  8. #8
    Membre expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Points : 3 712
    Points
    3 712
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT 
      GROUPE.SIGLEGROUPE,
      Sum(COALESCE(PRODUCTION.STHTPRODUIT,0)) AS CUMULPRODUCTION
    FROM
      GROUPE
      LEFT OUTER JOIN PRODUCTION ON 
      (GROUPE.CODEGROUPE = PRODUCTION.CODEGROUPE AND  PRODUCTION.AN =:REFAN AND  PRODUCTION.MOIS =:CHMOIS)
    GROUP BY
      GROUPE.SIGLEGROUPE
    Philippe Makowski
    IBPhoenix - Firebird
    Membre de l'April

  9. #9
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    Bravo makowski !

    génial le :
    Sum(COALESCE(PRODUCTION.STHTPRODUIT,0)) AS CUMULPRODUCTION
    et non

    COALESCE (Sum(PRODUCTION.STHTPRODUIT), 0) as CUMULPRODUCTION

    encore merci

    cantador

  10. #10
    Membre expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Points : 3 712
    Points
    3 712
    Par défaut
    et surtout le Left join dans le bon sens
    Philippe Makowski
    IBPhoenix - Firebird
    Membre de l'April

  11. #11
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    oui !

    j'ai toutefois un autre exemple avec 4 jointures qui ne marchent pas..

    cantador

  12. #12
    Membre expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Points : 3 712
    Points
    3 712
    Par défaut
    parce que tu fais mal les jointures
    Philippe Makowski
    IBPhoenix - Firebird
    Membre de l'April

  13. #13
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    hé hé, c'est bien possible !

    ça ressemble au cas précédent, mais il y a 4 tables cette fois-ci :

    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 
      TYPEREGLEMENT.LIBELLETYPEREGLEMENT,
      Sum(COALESCE(PRODUCTION.STHTPRODUIT, 0)) AS CUMULPRODUCTION
    FROM
      TYPEREGLEMENT
      LEFT OUTER JOIN TYPEAFFAIRE ON (TYPEREGLEMENT.CODETYPEREGLEMENT = TYPEAFFAIRE.CODETYPEREGLEMENT)
      LEFT OUTER JOIN AFFAIRE ON (TYPEAFFAIRE.CODETYPEAFFAIRE = AFFAIRE.CODETYPEAFFAIRE)
      LEFT OUTER JOIN DEVIS ON (AFFAIRE.CODEAFFAIRE = DEVIS.CODEAFFAIRE)
      LEFT OUTER JOIN PRODUCTION ON (DEVIS.CODEDEVIS = PRODUCTION.CODEDEVIS)
    WHERE
      PRODUCTION.AN =:REFAN AND
      PRODUCTION.MOIS =:CHMOIS
    GROUP BY
      TYPEREGLEMENT.LIBELLETYPEREGLEMENT
    et là ça ne marche pas car seuls les LIBELLETYPEREGLEMENT qui ont de la production s'affichent pas les autres.

    ?
    cantador

  14. #14
    Membre expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Points : 3 712
    Points
    3 712
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT 
      TYPEREGLEMENT.LIBELLETYPEREGLEMENT,
      Sum(COALESCE(PRODUCTION.STHTPRODUIT, 0)) AS CUMULPRODUCTION
    FROM
      TYPEREGLEMENT
      LEFT OUTER JOIN TYPEAFFAIRE ON (TYPEREGLEMENT.CODETYPEREGLEMENT = TYPEAFFAIRE.CODETYPEREGLEMENT)
      LEFT OUTER JOIN AFFAIRE ON (TYPEAFFAIRE.CODETYPEAFFAIRE = AFFAIRE.CODETYPEAFFAIRE)
      LEFT OUTER JOIN DEVIS ON (AFFAIRE.CODEAFFAIRE = DEVIS.CODEAFFAIRE)
      LEFT OUTER JOIN PRODUCTION ON (DEVIS.CODEDEVIS = PRODUCTION.CODEDEVIS AND
      PRODUCTION.AN =:REFAN AND
      PRODUCTION.MOIS =:CHMOIS)
    GROUP BY
      TYPEREGLEMENT.LIBELLETYPEREGLEMENT
    Philippe Makowski
    IBPhoenix - Firebird
    Membre de l'April

  15. #15
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    Autant pour moi...
    même erreur que précédemment..
    les paramètres sont dans la jointure et non dans le WHERE.

    Car dans ce cas le WHERE se comporte comme un filtre exclusif !

    bien vu makowski

    merci pour tes lumières

    cantador

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

Discussions similaires

  1. Requête n'affiche pas les champs null
    Par souf_87 dans le forum Oracle
    Réponses: 6
    Dernier message: 04/03/2011, 17h11
  2. [RegEx] Retrouver les sous-groupes nommés dans les résultats
    Par SpaceFrog dans le forum Langage
    Réponses: 2
    Dernier message: 14/07/2010, 22h18
  3. Requête count renvoyant aussi les résultats=0
    Par Peq13 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/03/2010, 15h33
  4. Réponses: 3
    Dernier message: 08/09/2006, 12h35
  5. Requête SELECT problème dans les résultats trouvés ...
    Par snoopy69 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 18/10/2005, 12h46

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