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

Requêtes et SQL. Discussion :

Calcul erronné avec fonction "Compte"


Sujet :

Requêtes et SQL.

  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 115
    Points : 275
    Points
    275
    Par défaut Calcul erronné avec fonction "Compte"
    Bonjour à tous,

    Je cherche à calculer le nombre de clients par mois grâce à ce SQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT UCase(Format$([devis et factures].[datedoc],'mmmm yyyy')) AS [Mois de], Count([Devis et Factures].[numclient]) AS [Nb Clients]
    FROM [Devis et Factures]
    GROUP BY UCase(Format$([devis et factures].[datedoc],'mmmm yyyy')), [Devis et Factures].TypeDoc, [Devis et Factures].EtatDocument, Year([devis et factures].[DateDoc])*12+DatePart('m',[devis et factures].[DateDoc])-1
    HAVING ((([Devis et Factures].TypeDoc)="facture") AND (([Devis et Factures].EtatDocument)="payé"))
    ORDER BY Year([devis et factures].[DateDoc])*12+DatePart('m',[devis et factures].[DateDoc])-1 DESC;
    or, il se trouve que le compte n'est pas bon sur certains enregistrements (rajout de + 1).
    Je me sers de [numclient] comme distinctif car il est sensé être unique.

    Une idée de pourquoi ce résultat erronné ?

  2. #2
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 786
    Points : 58 200
    Points
    58 200
    Billets dans le blog
    42
    Par défaut
    bonjour clickandgo,

    je commencerais bien par retirer le typedoc et l'etatdocument du GROUP BY.

  3. #3
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 115
    Points : 275
    Points
    275
    Par défaut
    Merci pour ta réponse F-Leb mais ces critères sont obligatoires en tant que filtre ... Alors, que faire ?

  4. #4
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 840
    Points : 14 944
    Points
    14 944
    Par défaut
    bonjour,
    Un filtre sur un champ n'implique pas un regroupement. Comme te l'as dit f-leb, enlève tes champs de filtre du regroupement et remplace HAVING par WHERE:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT UCase(Format$([devis et factures].[datedoc],'mmmm yyyy')) AS [Mois de], Count([Devis et Factures].[numclient]) AS [Nb Clients]
    FROM [Devis et Factures]
    GROUP BY UCase(Format$([devis et factures].[datedoc],'mmmm yyyy')),  Year([devis et factures].[DateDoc])*12+DatePart('m',[devis et factures].[DateDoc])-1
    WHERE ((([Devis et Factures].TypeDoc)="facture") AND (([Devis et Factures].EtatDocument)="payé"))
    ORDER BY Year([devis et factures].[DateDoc])*12+DatePart('m',[devis et factures].[DateDoc])-1 DESC;

  5. #5
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 786
    Points : 58 200
    Points
    58 200
    Billets dans le blog
    42
    Par défaut
    salut,

    pour compléter la réponse de tee_grandbois, le WHERE doit être placé avant le GROUP BY.

    SELECT ...
    FROM ...
    WHERE ...
    GROUP BY...
    ORDER BY...

    dans le QBE, il faut mettre l'opération "Où" sur les critères.


  6. #6
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 115
    Points : 275
    Points
    275
    Par défaut
    Merci à tous pour vos réponses mais le compte continue à être erroné ...

    C'est d'autant plus bizarre que si j'annule le regroupement le nombre de clients devient alors exact

  7. #7
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 786
    Points : 58 200
    Points
    58 200
    Billets dans le blog
    42
    Par défaut
    va falloir donner le SQL de la requête actuelle, un petit jeu de données, ce que la requête devrait retourner et ce qu'elle retourne.
    Parce que là...

  8. #8
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 115
    Points : 275
    Points
    275
    Par défaut
    J'ai déjà eu ce genre de problème ... Il s'avère que je ne retrouve pas le post que j'avais formulé à l' époque sur ce forum ou un autre ...

    J'avais voulu compter le nombre de clients sur une requête et l'on m'avait conseillé d'utiliser "select distinct" , cela produisant un conflit avec "order by", donc pas de solution, aujourd'hui non plus ...

    J'ai modifié mon SQL comme conseillé, l'erreur subsiste sur un seul registre qui me donne 4 clients alors qu'il n'y en a que 3 pour ce mois ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT UCase(Format$([devis et factures].[datedoc],'mmmm yyyy')) AS [Mois de], Count([Devis et Factures].numclient) AS [Nb Clients]
    FROM [Devis et Factures]
    WHERE ((([Devis et Factures].TypeDoc)="facture") AND (([Devis et Factures].EtatDocument)="payé"))
    GROUP BY UCase(Format$([devis et factures].[datedoc],'mmmm yyyy')), Year([devis et factures].[DateDoc])*12+DatePart('m',[devis et factures].[DateDoc])-1
    ORDER BY Year([devis et factures].[DateDoc])*12+DatePart('m',[devis et factures].[DateDoc])-1 DESC;
    Une suggestion ? Merci d' avance

  9. #9
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 786
    Points : 58 200
    Points
    58 200
    Billets dans le blog
    42
    Par défaut
    Citation Envoyé par clickandgo Voir le message
    et l'on m'avait conseillé d'utiliser "select distinct...
    Bon sang, mais c'est bien sûr. Il te faut le nombre de clients distincts.

    C'est un peu comme .

    Tu fais une sous-requête nommée SR:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT DISTINCT
      UCase(Format$([devis et factures].[datedoc],'mmmm yyyy')) AS [Mois de],
      Year([devis et factures].[DateDoc])*12+DatePart('m',[devis et factures].[DateDoc])-1 AS [OrdreDate],
      [devis et factures].numclient
    FROM [Devis et Factures]
    WHERE ((([Devis et Factures].TypeDoc)="facture") AND 
                 (([Devis et Factures].EtatDocument)="payé"));

    puis la requête principale:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT [Mois de], count(*) as [Nb Clients]
    FROM SR
    GROUP BY [Mois de], [OrdreDate]
    ORDER BY [OrdreDate]

    bon, à tester malgré tout...

  10. #10
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 115
    Points : 275
    Points
    275
    Par défaut
    Merci F-Leb, je suis sûr que c'est çà ...

    Je vais essayer demain et je mettrais en "résolu" le cas échéant.

    Bonne journée

  11. #11
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 115
    Points : 275
    Points
    275
    Par défaut
    ça marche nickel !

    Génial !

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 30/06/2005, 12h50

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