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 :

Problème de résultats


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 Problème de résultats
    Bonjour,

    Je veux en fait faire resortir le nombre d'incidents traités par gamme de problèmes ainsi que le pourcentage que cela représente.
    Le problème c'est que, lorsque je le fais sur une seule gamme, le pourcentage est juste mais lorsque je le fais sur plusieurs gammes, le pourcentage est incohérent.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select hotliner as Hotliner, codegamme as Gamme, count (*) as "Nombre d incidents", count (*) * 100 / (select count (*) from problems where 
    datecloture between date '2007-09-10' and date '2007-09-15' and codegamme  in ('REFERENTIEL')
    group by codegamme) as Pourcentage
    from problems
    where datecloture between date '2007-09-10' and date '2007-09-15'
    and codegamme in ('REFERENTIEL')
    group by codegamme, hotliner
    order by hotliner
    Je trouve par exemple pour l'utilisateur A un nombre d'incidents traité pour la gamme REFERENTIEL de 21 ce qui représente un pourcentage de 30.43 ce qui est juste puisque mon total est de 69.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select hotliner as Hotliner, codegamme as Gamme, count (*) as "Nombre d incidents", count (*) * 100 / (select count (*) from problems where 
    datecloture between date '2007-09-10' and date '2007-09-15' and codegamme not in 
    ('ETU-3270','ETU-ADV','ETU-FIDEL','ETU-MESIR','ETU-PRE')
    group by codegamme) as Pourcentage
    from problems
    where datecloture between date '2007-09-10' and date '2007-09-15'
    and codegamme not in ('ETU-3270','ETU-ADV','ETU-FIDEL','ETU-MESIR','ETU-PRE')
    group by codegamme, hotliner
    order by hotliner
    Je trouve pour l'utilisateur A un nombre d'incidents traité pour la gamme REFERENTIEL de 21 ce qui représente un pourcentage de 44.68

    Quelle est mon erreur ?

  2. #2
    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
    J'ai identifié le problème mais je n'arrive pas à le résoudre...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT (SELECT count (*) FROM problems WHERE 
    datecloture BETWEEN date '2007-09-10' AND date '2007-09-15' AND codegamme NOT IN 
    ('ETU-3270','ETU-ADV','ETU-FIDEL','ETU-MESIR','ETU-PRE')
    GROUP BY codegamme)
    FROM problems
    ... cette requête me retourne dans toutes les lignes de la colonne de résultats le total de la première gamme alors que toutes les valeurs devraient être différentes...

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 103
    Points : 28 400
    Points
    28 400
    Par défaut
    Si tu nous disais par rapport à quoi le pourcentage doit être calculé, il serait peut-être plus facile de t'aider à trouver ton erreur

  4. #4
    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
    en fait j'ai plein de gammes, de hotliners... donc on va essayer de simplifier.

    Prenons les gammes ETU-PF, BUR-MAT et REFERENTIEL
    Prenons les hotliners AB, MB et SK

    AB a traité 0 incident BUR-MAT sur 47, soit 0%
    MB a traité 1 incident BUR-MAT sur 47, soit 2.12%
    SK a traité 1 incident BUR-MAT sur 47, soit 2.12%

    AB a traité 1 incident ETU-PF sur 19, soit 5.26%
    MB a traité 1 incident ETU-PF sur 19, soit 5.26%
    SK a traité 2 incident ETU-PF sur 19, soit 10.52%

    AB a traité 21 incident REFERENTIEL sur 69, soit 30.43%
    MB a traité 2 incident REFERENTIEL sur 69, soit 2.89%
    SK a traité 24 incident REFERENTIEL sur 69, soit 34.78%


    Le problème est que, avec ma requête, au lieu de se servir du total de chaque gamme
    pour calculer le pourcentage, càd 47, 19 et 69,
    ce calcul se fait avec comme total celui de la première gamme, càd 47.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select hotliner as Hotliner, codegamme as Gamme, count (*) as "Nombre d incidents", count (*) * 100 / (select count (*) from problems where datecloture between date '2007-09-10' and date '2007-09-15' and codegamme not in ('ETU-3270','ETU-ADV','ETU-FIDEL','ETU-MESIR','ETU-PRE')
    group by codegamme) as Pourcentage
    from problems
    where datecloture between date '2007-09-10' and date '2007-09-15'
    and codegamme not in ('ETU-3270','ETU-ADV','ETU-FIDEL','ETU-MESIR','ETU-PRE')
    group by codegamme, hotliner
    order by hotliner
    Donc, au lieu d'avoir les pourcentages ci-dessus, j'obtiens :

    - POUR BUR-MAT :
    AB : 0%
    MB : 2.12%
    SK : 2.12%
    Ce qui est juste puisqu'il se sert de ce total.

    - Pour ETU-PF :
    AB : 2.12% au lieu de 5.26%
    MB : 2.12% au lieu de 5.26%
    SK : 4.25% au lieu de 10.52%
    Ce qui est faux car il prend comme total 47 et non 19.

    - Pour REFERENTIEL :
    AB : 44.68% au lieu de 30.43%
    MB : 4.25% au lieu de 2.89%
    SK : 54.06% au lieu de 34.78%

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 103
    Points : 28 400
    Points
    28 400
    Par défaut
    Donc tu souhaites calculer, dans chaque gamme, le % de problèmes traité par chaque hotliner...
    Pourrais-tu nous préciser quel SGBD tu utilises ?

  6. #6
    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
    alors du SQL sur une database nexus...

  7. #7
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 103
    Points : 28 400
    Points
    28 400
    Par défaut
    Comme ça peut-être :
    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  pbm.hotliner    AS Hotliner
        ,   pbm.codegamme   AS Gamme
        ,   COUNT(*)        AS "Nombre d incidents"
        ,   COUNT(*) * 100 / tot.cnt AS Pourcentage
    FROM    problems    AS pbm
        INNER JOIN
        (   SELECT  codegamme
                ,   COUNT(*)    AS cnt
            FROM    problems 
            WHERE   datecloture BETWEEN DATE '2007-09-10' AND DATE '2007-09-15' 
            GROUP BY codegamme
        )   AS  tot
        ON  tot.codegamme = pbm.codegamme
    WHERE   pbm.datecloture BETWEEN DATE '2007-09-10' AND DATE '2007-09-15'
        AND pbm.codegamme NOT IN ('ETU-3270','ETU-ADV','ETU-FIDEL','ETU-MESIR','ETU-PRE')
    GROUP BY pbm.codegamme
        ,   pbm.hotliner
    ORDER BY pbm.hotliner
    ;

  8. #8
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Erreur(s):
    NexusDB: Query: Query execution failed:
    Unexcepted exception object raised: [Exception] Ambiguous column reference:"codegamme" at line 5, pos 10 [$3CA1/15521]

  9. #9
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 103
    Points : 28 400
    Points
    28 400
    Par défaut
    En effet, j'avais oublié de qualifier les colonnes dans la clause WHERE et les suivantes.
    Mais tu l'avais trouvé tout seul...

  10. #10
    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 et j'obtiens une autre erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Erreur(s):
    NexusDB: Query: Query execution failed:
    Unexpected exception object raised: [Exception] The column reference "cnt" must either appear in the grouping list or in an aggregate expression [$3CA1/15521]
    Sauf que là je ne sais pas d'où cela vient...

  11. #11
    Membre régulier
    Inscrit en
    Septembre 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 63
    Points : 71
    Points
    71
    Par défaut
    Dans le group by tu as mit le nouvel allias ???

  12. #12
    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
    Quel alias ???

    J'ai tapé la requête là :

    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  pbm.hotliner    AS Hotliner
        ,   pbm.codegamme   AS Gamme
        ,   COUNT(*)        AS "Nombre d incidents"
        ,   COUNT(*) * 100 / tot.cnt AS Pourcentage
    FROM    problems    AS pbm
        INNER JOIN
        (   SELECT  codegamme
                ,   COUNT(*)    AS cnt
            FROM    problems 
            WHERE   datecloture BETWEEN DATE '2007-09-10' AND DATE '2007-09-15' 
            GROUP BY codegamme
        )   AS  tot
        ON  tot.codegamme = pbm.codegamme
    WHERE   pbm.datecloture BETWEEN DATE '2007-09-10' AND DATE '2007-09-15'
        AND pbm.codegamme NOT IN ('ETU-3270','ETU-ADV','ETU-FIDEL','ETU-MESIR','ETU-PRE')
    GROUP BY pbm.codegamme
        ,   pbm.hotliner
    ORDER BY pbm.hotliner
    ;

    Et ça me donne le message d'erreur là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Erreur(s):
    NexusDB: Query: Query execution failed:
    Unexpected exception object raised: [Exception] The COLUMN reference "cnt" must either appear IN the grouping list OR IN an aggregate expression [$3CA1/15521]

  13. #13
    Membre régulier
    Inscrit en
    Septembre 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 63
    Points : 71
    Points
    71
    Par défaut
    Ajoute 'cnt' dans le GROUP BY

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT  codegamme
                ,   COUNT(*)    AS cnt
            FROM    problems 
            WHERE   datecloture BETWEEN DATE '2007-09-10' AND DATE '2007-09-15' 
            GROUP BY codegamme, cnt

  14. #14
    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
    Cela ne fonctionne pas...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Erreur(s):
    NexusDB Query: Query execution failed:
    Unexcepted exception object raiser: [Exception] Error in statement: Unknown column: cnt [$3CA1/15521]

  15. #15
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 103
    Points : 28 400
    Points
    28 400
    Par défaut
    L'erreur est là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT  ...
    GROUP BY pbm.codegamme
        ,   pbm.hotliner
        ,   tot.cnt
    ORDER BY pbm.hotliner
    ;
    Je t'encourage à aller (re)lire le Cours sur les Regroupements et le Cours sur les Sous-Requêtes

  16. #16
    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 ça marche !!!

    Je vais essayer d'aller lire les cours mais je t'avouerai que les documentations en ce moment je sature un peu :
    SQL : 450 pages
    SQL sur Nexus : 170 pages en anglais
    Documentation sur un programme de graphisme : 250 pages

    Mais je vais aller jeter un bon coup d'oeil quand même... en tout cas merci !

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

Discussions similaires

  1. [MySQL] problème de résultat avec une requête
    Par jexl dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 29/03/2006, 23h23
  2. [SQL] Problème de résultat avec une requête
    Par raptorman dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 04/01/2006, 17h16
  3. Problème de résultat
    Par Mephisto08 dans le forum C
    Réponses: 21
    Dernier message: 28/09/2005, 08h57
  4. [VBA] Calcul du PGDC --> Problème de résultat
    Par snoopy69 dans le forum Access
    Réponses: 16
    Dernier message: 25/08/2005, 14h23
  5. problème avec résultat de recherche multi-critères
    Par audrey_desgres dans le forum Access
    Réponses: 2
    Dernier message: 23/06/2005, 11h00

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