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 :

Select qui donne 0 s'il n'y a rien


Sujet :

Langage SQL

  1. #1
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut Select qui donne 0 s'il n'y a rien
    Bonjour à tous,

    Alors je sais d'avance que ma question est toute simple mais j'ai tout simplement un trou sur le nom de ce que je cherche et ne parvient donc pas à trouver l'info.

    Je commence par poser les bases.

    J'ai 2 tables (dont je ne citerai que les champs qui m'intéressent)

    table 1 : id_rayon

    table 2 : id_rayon ; montant


    La table 1 contient donc une liste de rayons d'un magasin et la table 2 reprend des montants (ici en fait des montants de vol) pour les rayons où il y en a.

    Ce que je veux c'est faire une requête de sélection qui me retourne l'id du rayon ainsi que la somme du montant pour chaque rayon. Jusque là, c'est facile. Mais il faut que pour les rayons où il n'y a rien, la requête retourne 0 comme montant.

    Je sais que c'est juste un opérateur ou une fonction mais je ne parviens plus à trouver l'info.

    Merci d'avance.

    Griftou.

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Salut,

    Ca dépend de ton SGBD, il y a IFNULL, ou nvl pour oracle, cf le comparatif

  3. #3
    Membre confirmé Avatar de lper
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    398
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 398
    Points : 641
    Points
    641
    Par défaut
    Bonjour,
    je te propose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select a.id_rayon, sum(b.montant) 
    from table1 a
     left outer join table2 on a.id_rayon = b.id_rayon
    group by a.id_rayon

  4. #4
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    Ah voilà le outer join !

    Je savais bien que c'était tout con.

    Merci beaucoup ! (je testerai demain pcq j'suis rentré chez moi entre temps^^)

    Griftou.

  5. #5
    Membre confirmé Avatar de elbj
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Services à domicile

    Informations forums :
    Inscription : Novembre 2004
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    Bonjour

    Je me permets de reprendre le code de lper.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT a.id_rayon, SUM(COALESCE(b.montant,0))
    FROM table1 a
      LEFT JOIN table2 ON a.id_rayon = b.id_rayon
    GROUP BY a.id_rayon
    Suivant le SGBD il faut remplacer COALESCE par la fonction de gestion des valeurs null (ISNULL, IFNULL, ESKEUTNULL, NULLORNOTNULL, ...).

    Cordialement

  6. #6
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    Je pense que la requête de lper fonctionnera mieux car le soucis n'est pas que la table 2 contient des valeurs nulles mais plutot qu'il n'y a pas de record quand il n'y a pas de données pour le rayon.

    Griftou.

  7. #7
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 738
    Points
    11 738
    Par défaut
    Citation Envoyé par elbj Voir le message
    Suivant le SGBD il faut remplacer COALESCE par la fonction de gestion des valeurs null (ISNULL, IFNULL, ESKEUTNULL, NULLORNOTNULL, ...).
    COALESCE est normalisé et supporté notamment par Oracle, SQL Server, MySQL, etc.

    Citation Envoyé par griftou Voir le message
    Je pense que la requête de lper fonctionnera mieux car le soucis n'est pas que la table 2 contient des valeurs nulles mais plutot qu'il n'y a pas de record quand il n'y a pas de données pour le rayon.
    ça revient au même, car la jointure externe génèrera des NULLs quand il n'y a pas de ligne sur la table 2.

  8. #8
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    Ah, le grand sachem a parlé ^^.

    Voilà qui met tout le monde d'accord.

    Bon, moi je vous dis à demain.

    Griftou.

  9. #9
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonsoir,

    @griftou
    Ah, le grand sachem a parlé ^^.

    Voilà qui met tout le monde d'accord.
    Évidemment puisque qu'il s'agit d'un forum sur le langage SQL ! Le plus souvent normalisé, en l'absence du SGBD on ne peut que supposer !!!


    La solution de @Elbj est censé dans ce qu'il dit...

    C'est la réponse qu'il fallait donner je pense.


  10. #10
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 738
    Points
    11 738
    Par défaut
    Citation Envoyé par Chtulus Voir le message
    La solution de @Elbj est sensée dans ce qu'il dit...

    C'est la réponse qu'il fallait donner je pense.
    ugh !

  11. #11
    Membre confirmé Avatar de lper
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    398
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 398
    Points : 641
    Points
    641
    Par défaut
    Citation Envoyé par elbj Voir le message

    Je me permets de reprendre le code de lper.
    Merci pour la correction (j'avais pris un exemple avec le count au lieu du SUM).

  12. #12
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    Bonjour à vous,

    Alors voilà, je viens de tester ça marchait très bien jusqu'à ce que je rajoute une clause where.

    Je l'avais omise dans l'explication afin de simplifier le problème en pensant que cette clause n'intervenait en rien mais apparemment, je me trompais.

    Dans cette clause il y a une condition sur une date (je teste si elle est bien dans le mois courant) et sur champ oui/non qui doit être à non. Ces deux tests se font sur la table 2.

    Rien de bien compliquer donc. Pourquoi n'ai-je donc plus les 0 pour les lignes "vides" ?

    Griftou.

  13. #13
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    salut,

    poste la requête.

    Merci

  14. #14
    Membre confirmé Avatar de lper
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    398
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 398
    Points : 641
    Points
    641
    Par défaut
    Créé une sous-requête (si la base le permet) sur la table 2 en y mettant ta clause Where :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT a.id_rayon, SUM(COALESCE(b.montant,0))
    FROM table1 a
      LEFT JOIN 
    (select id_rayon, montant from table2 where ....) b ON a.id_rayon = b.id_rayon
    GROUP BY a.id_rayon

  15. #15
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    Salut,

    peux-tu nous montrer la requête que tu as tapée (avec le where donc), afin qu'on y voit plus clair?


  16. #16
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    Merci lper pour l'idée de la sous-requête, ça tourne nickel !!!

    Merci aux autres aussi bien sûr !

    Griftou.

    P.S. : Voulez-vous vraiment voir la requête ? Pcq je travaille sur une autre machine et donc pas moyen de faire de copier coller. J'avoue que j'suis très fainéant

  17. #17
    Membre confirmé Avatar de elbj
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Services à domicile

    Informations forums :
    Inscription : Novembre 2004
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    Coucou

    Tu devrais l'écrire ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT a.id_rayon, SUM(COALESCE(b.montant,0))
    FROM table1 a
      LEFT JOIN table2 b 
        ON a.id_rayon = b.id_rayon
        AND ...  <-- là tu mets tes clauses qui étaient dans le where
    GROUP BY a.id_rayon
    Cordialement

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

Discussions similaires

  1. SELECT qui ne retourne rien à cause d'anti-slash
    Par mikyfpc dans le forum Outils
    Réponses: 8
    Dernier message: 07/08/2005, 23h04
  2. Requete SELECT qui cause une erreur SQL
    Par ahage4x4 dans le forum ASP
    Réponses: 23
    Dernier message: 10/06/2005, 14h46
  3. Select qui boucle ou se termine par un Ora-01460
    Par PatriceP dans le forum Oracle
    Réponses: 4
    Dernier message: 29/10/2004, 08h53
  4. Pb de selection qui ne se fait pas
    Par Stef.proxi dans le forum Langage SQL
    Réponses: 4
    Dernier message: 06/08/2004, 10h54
  5. 2 SELECT Qui ne s'entendent pas très bien entre eux :(
    Par moutanakid dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 05/08/2004, 16h46

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