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 :

requête qui me renvoie des 0


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    512
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Juin 2007
    Messages : 512
    Points : 97
    Points
    97
    Par défaut requête qui me renvoie des 0
    Bonjour,

    Voici ma requête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT libelle_offre,obj,count(v.num_vente) as nbvente from offres of 
    LEFT OUTER JOIN 
    (SELECT obj,code_offre from obectifs where num_semaine ='2' AND annee = '2010')ob 
    ON of.code_offre = ob.code_offre
     LEFT OUTER JOIN 
    (SELECT num_vente,code_offre,date_vente from ventes v where num_agent ='1' and date_vente = '2010-01-13') v 
    ON of.code_offre = v.code_offre 
    where of.code_offre LIKE '%_qe' GROUP BY of.code_offre,libelle_offre,obj";
    count(num_vente) me retourne 0 alors que je devrais avoir 1

    Je souhaite récupéré une liste d'offres et pour chaque offre compter le nombre de ventes correspondant dans ma table ventes ainsi que afficher l'objectif de vente correspondant à chaque offre...

    Merci de votre aide

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    La requête retourne t-elle un résultat sans le GROUP BY et le COUNT ?

    Essaie sans les sous-requêtes et en mettant des alias partout :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT of.libelle_offre, ob.obj, 
      COUNT(v.num_vente) AS nbvente 
    FROM offres of 
    LEFT OUTER JOIN objectifs ob ON of.code_offre = ob.code_offre
    LEFT OUTER JOIN ventes v ON of.code_offre = v.code_offre 
    WHERE of.code_offre LIKE '%_qe' 
      AND ob.num_semaine = 2 
      AND ob.annee = 2010
      AND v.num_agent = 1 
      AND v.date_vente = '2010-01-13'
    GROUP BY of.code_offre, of.libelle_offre, ob.obj;
    Au passage, j'ai considéré que num_semaine, annee et num_agent sont des colonnes de type numérique et j'ai supprimé les apostrophes autour de ces valeurs.

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Vos WHERE vont tuer la partie externe des requêtes.

    Si les count renvoie 0 c'est qu'il n'y a pas de correspondance selon la jointure déclarée (count(null) = 0).

    Votre requête initiale peut être réécrite ainsi :
    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
    SELECT
        of.libelle_offre,
        of.obj,
        count(v.num_vente) AS nbvente
    FROM
        offres of 
        LEFT OUTER JOIN objectifs ob
          ON ob.code_offre = of.code_offre
         AND ob.num_semaine = 2
         AND ob.annee = 2010
        LEFT OUTER JOIN ventes v
          ON v.code_offre = of.code_offre
         AND v.num_agent = 1
         AND v.date_vente = '2010-01-13'
    WHERE
        of.code_offre LIKE '%_qe'
    GROUP BY
        of.libelle_offre,
        of.obj;
    Quel est votre SGBD (afin d'écrire correctement la date) ?

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    512
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Juin 2007
    Messages : 512
    Points : 97
    Points
    97
    Par défaut
    cette requête fonctionne très bien merci beaucoup

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    512
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Juin 2007
    Messages : 512
    Points : 97
    Points
    97
    Par défaut
    J'ai de nouveau à peu près le même soucis, voici ma requête et ma "colonne" objectif ne m'affiche rien alor qu'elle fdevrai me renvoyer à un moment 2 et à un autre 7 en plus de champs vide lorsque je n'ai pas de correspondance dans ma base

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT of.libelle_offre, ob.obj, count( v.num_vente ) AS nbvente
    FROM offres of
    LEFT OUTER JOIN obectifs ob ON ob.code_offre = of.code_offre
    AND ob.num_semaine = '2'
    AND ob.annee = '2010'
    LEFT OUTER JOIN ventes v ON v.code_offre = of.code_offre
    AND v.num_agent = '1'
    WHERE of.code_canal LIKE '%_qe'
    GROUP BY of.libelle_offre, ob.obj;
    Merci.

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Quelle colonne objectif ? ob.obj ?
    Les objectifs que tu attends sont bien présents en BDD pour la semaine demandée ?

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    512
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Juin 2007
    Messages : 512
    Points : 97
    Points
    97
    Par défaut
    oui ob.obj et ils sont présents dans ma BDD

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select libelle_offre,obj,count(num_vente) as nbvente 
    from offres of 
    left outer join obectifs ob on of.code_offre = ob.code_offre 
      and ob.num_semaine =3 
      and ob.annee =2010 
    left outer join ventes v on of.code_offre = v.code_offre 
      and v.num_agent =1 
      and v.date_vente between '2010-01-18' and '2010-01-22' 
    where of.code_canal like '%crc_qe%' 
    group by libelle_offre,obj;
    et cette requête,que j'ai fais ce matin fonctionne

    Peut-être des objections de ta part?

    Merci.

  8. #8
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Etrange !
    En dehors du fait que dans la dernière requête les valeurs numériques ne sont plus encadrées par des apostrophes, ce qui est mieux, les résultats de la dernière requête devraient être inclus dans les résultats de la précédente puisque la dernière est plus restrictive que la précédente.

    C'est quel SGBD ?
    Certains sont plus permissifs que d'autres. MySQL transforme les valeurs numériques entourées d'apostrophes en vraies valeurs numériques. D'autres doivent comparer une chaîne de caractère à un nombre et ne retournent rien.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    512
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Juin 2007
    Messages : 512
    Points : 97
    Points
    97
    Par défaut
    c'est MySQL...je t'avoue que je comprends pas trop...je vois pas d'où venait le soucis...

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    512
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Juin 2007
    Messages : 512
    Points : 97
    Points
    97
    Par défaut
    Cette requête me pose soucis, je suppose que cela vient de ma sous requête mais je ne vois pas comment faire autrement.

    J'ai une ligne où ma colonne objectifs me retourne 6 au lieu de 3,
    et une ligne où ma colonne nbvente me retourne 2 au lieu de 1...
    Ces erreurs ne sont pas sur les mêmes lignes, mais je comprends pas pourquoi cela fait ça...

    Voici la requête en question :


    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
     
    SELECT of.libelle_offre,
      sum(ob.obj) as objectifs,
      count(v.num_vente) AS nbvente 
    FROM offres of 
    LEFT OUTER JOIN obectifs ob ON ob.code_offre = of.code_offre 
      AND ob.num_semaine = '3' 
      AND ob.annee = '2010' 
      AND ob.num_agent in (
        SELECT num_agent 
        from agents 
        where num_equipe = '1') 
    LEFT OUTER JOIN ventes v ON v.code_offre = of.code_offre 
      AND v.num_agent in (
        SELECT num_agent 
        from agents where num_equipe = '1') 
      AND v.date_vente BETWEEN '2010-01-18' AND '2010-01-19' 
    WHERE of.code_offre LIKE '%_qe' 
    GROUP BY of.libelle_offre;
    Merci du coup de main

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Bonjour,

    Vous n'avez pas de condition de jointure entre objectifs et ventes. Donc, s'il y a plusieurs objectifs et plusieurs ventes pour un même code_offre, il fera un produit cartésien entre ces différentes lignes, multipliant les résultats.
    Vous pouvez faire vos agrégations avant la jointure sur offres :
    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
     
    SELECT 
           of.libelle_offre,
           ob.objectifs,
           v.nbvente 
    FROM offres of 
    LEFT OUTER JOIN 
         (
          SELECT ob.code_offre, 
                 sum(ob.obj) AS objectifs
          FROM obectifs ob 
          WHERE ob.num_semaine = '3' 
            AND ob.annee = '2010' 
            AND ob.num_agent IN (SELECT num_agent FROM agents WHERE num_equipe = '1')
          GROUP BY ob.code_offre
         ) ob 
         ON ob.code_offre = of.code_offre 
    LEFT OUTER JOIN 
         (
          SELECT v.code_offre,
                 count(v.num_vente) AS nbvente
          FROM ventes v 
          WHERE v.num_agent IN (SELECT num_agent FROM agents WHERE num_equipe = '1') 
            AND v.date_vente BETWEEN '2010-01-18' AND '2010-01-19'
          GROUP BY v.code_offre
         ) v 
         ON v.code_offre = of.code_offre 
    WHERE of.code_offre LIKE '%_qe';

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    512
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Juin 2007
    Messages : 512
    Points : 97
    Points
    97
    Par défaut
    euh ben la je tire mon chapeau

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    512
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Juin 2007
    Messages : 512
    Points : 97
    Points
    97
    Par défaut
    Je viens de faire selon votre modèle cette requête qui fonctionne très bien lorsqu'on l'execute directement sous MySQL et qui ne m'affiche rien dans la colonne nbvente lorsque je l'affiche via mon site intranet...Cela vient-il de la requête?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT of.libelle_offre,ob.objectifs,v.nbvente 
    FROM offres of 
    LEFT OUTER JOIN 
    (SELECT ob.code_offre, sum(ob.obj) AS objectifs FROM obectifs ob WHERE ob.num_semaine = '3' AND ob.annee = '2010' AND ob.num_agent IN 
    (SELECT num_agent from agents,equipes,crc where agents.num_equipe = equipes.code_equipe AND crc.num_crc = equipes.crc AND equipes.crc = '2') 
    GROUP BY ob.code_offre) ob 
    ON ob.code_offre = of.code_offre 
    LEFT OUTER JOIN 
    (SELECT v.code_offre,count(v.num_vente) AS nbvente FROM ventes v WHERE v.num_agent IN (SELECT num_agent from agents,equipes,crc where agents.num_equipe = equipes.code_equipe AND crc.num_crc = equipes.crc AND equipes.crc = '2') 
    AND v.date_vente = '2010-01-19' GROUP BY v.code_offre) v 
    ON v.code_offre = of.code_offre 
    WHERE of.code_offre LIKE '%_qe';
    En tout cas merci beaucoup

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    512
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Juin 2007
    Messages : 512
    Points : 97
    Points
    97
    Par défaut
    erreur de ma part j'ai trouvé pourquoi, un oublie qui faussait tout...

    Merci!!!

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    512
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Juin 2007
    Messages : 512
    Points : 97
    Points
    97
    Par défaut
    J'ai de nouveau une erreur dans ma requête, qui me renvoie pas forcément des 0 mais les résultats sont incohérents par rapport à ma base de données...je cherche depuis un petit moment mais je n'ai pas trouvé la solution, voici ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT of.libelle_offre,sum(ob.obj) as obj,count(v.num_vente) AS nbvente FROM offres of LEFT OUTER JOIN obectifs ob ON ob.code_offre = of.code_offre 
    AND ob.num_semaine = '01' 
    OR ob.num_semaine = '2' 
    AND ob.annee = '2010' 
    AND num_agent='1' LEFT OUTER JOIN ventes v ON v.code_offre = of.code_offre 
    AND v.num_agent = '1' 
    AND v.date_vente BETWEEN '2010-01-04' 
    AND '2010-01-22' 
    WHERE of.code_canal = 'crc_qe' 
    GROUP BY of.libelle_offre,ob.obj 
    order by ordre
    c'est ma somme qui ne "fonctionne" pas correctement. je pense que le soucis est lié à mon 'OR' mais je n'ai pas le choix que d'en faire un.

    Merci de votre aide

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    512
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Juin 2007
    Messages : 512
    Points : 97
    Points
    97
    Par défaut
    Citation Envoyé par Snipah Voir le message
    Bonjour,


    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
     
    SELECT 
           of.libelle_offre,
           ob.objectifs,
           v.nbvente 
    FROM offres of 
    LEFT OUTER JOIN 
         (
          SELECT ob.code_offre, 
                 sum(ob.obj) AS objectifs
          FROM obectifs ob 
          WHERE ob.num_semaine = '3' 
            OR ob.num_semaine = '2'
            AND ob.annee = '2010' 
            AND ob.num_agent = '1'
          GROUP BY ob.code_offre
         ) ob 
         ON ob.code_offre = of.code_offre 
    LEFT OUTER JOIN 
         (
          SELECT v.code_offre,
                 count(v.num_vente) AS nbvente
          FROM ventes v 
          WHERE v.num_agent = '1'
            AND v.date_vente BETWEEN '2010-01-18' AND '2010-01-19'
          GROUP BY v.code_offre
         ) v 
         ON v.code_offre = of.code_offre 
    WHERE of.code_offre LIKE '%_qe';

    j'ai repris cette structure et cela fonctionne. merci

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

Discussions similaires

  1. Une requête qui me recupère des doublons
    Par Invité dans le forum Requêtes
    Réponses: 2
    Dernier message: 05/04/2012, 10h51
  2. requête qui ne renvoie qu'une donnée
    Par arckaniann dans le forum Langage
    Réponses: 13
    Dernier message: 28/12/2011, 19h20
  3. Réponses: 2
    Dernier message: 31/03/2010, 15h02
  4. [SQL-Server] Requête qui ne renvoie rien PHP5 et SQL SERVER 2000
    Par Sytchev3 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 28/05/2009, 09h46
  5. Requête qui casse pas des briques
    Par DJ Caësar 9114 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 27/01/2008, 12h23

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