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 lié à l'utilisation de WHERE, GROUP BY et HAVING


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 3
    Par défaut Problème lié à l'utilisation de WHERE, GROUP BY et HAVING
    Bonjour tout le monde,

    Je viens sur ce forum en espérant que vous puissiez éclairer ma lanterne. En effet, je suis sur un projet et lors de la conception de mes requêtes SQL, je me suis rendu compte d'un problème :
    Deux requètes sensiblement différentes font le même calcul : les résultats sont différents.

    Des tests montre que la différence se situe lors des restrictions : l'un fait un GROUP BY suivi d'un Having , tandis que l'autre à un WHERE, un GROUP BY et un HAVING

    Voici les requêtes SQL :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT Sum([Alias].[refus]) AS refus, sum([Alias].[resultat]) AS resultat
    FROM (
    SELECT Sum(T_FICHIER.FIC_NBRE_PIECE_REFUSE) AS refus, Sum(T_FICHIER.FIC_NBRE_PIECE_CONTROLE) AS resultat
    FROM T_FICHIER
    GROUP BY T_FICHIER.FIC_REFERENCE, T_FICHIER.FIC_NUM_LOT, T_FICHIER.FIC_NBRE_PIECE_CONTROLE, T_FICHIER.FIC_DATE
    HAVING (((T_FICHIER.FIC_REFERENCE)=[reference]) AND ((T_FICHIER.FIC_NUM_LOT) Not Like '*reb*') AND (sum(T_FICHIER.FIC_NBRE_PIECE_CONTROLE)>[seuil]) AND ((Month([T_FICHIER].[FIC_DATE]))=[mois]))
    ) AS ALIAS;
    La deuxième :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT Sum([%$##@_Alias].refus) AS Refusées, Sum([%$##@_Alias].resultat) AS controlées
    FROM (
    SELECT Sum([T_FICHIER].[FIC_NBRE_PIECE_REFUSE]) AS refus, Sum([T_FICHIER].[FIC_NBRE_PIECE_CONTROLE]) AS resultat
    FROM T_FICHIER
    WHERE T_FICHIER.FIC_NUM_LOT Not Like "*reb*" AND T_FICHIER.FIC_REFERENCE=[reference] AND Month(T_FICHIER.FIC_DATE)=[mois]
    GROUP BY [T_FICHIER].[FIC_NUM_LOT]
    HAVING sum(T_FICHIER.FIC_NBRE_PIECE_CONTROLE)>[seuil]
    ) AS [%$##@_Alias];
    Voila. Personnelement, je n'y vois pas de différence, mais peut-être que l'oeil d'un habitué du langage SQL y découvrira une faille.

    Merci à vous.

  2. #2
    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 : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Par défaut
    Bonjour,

    Lorsque tu utilise la CLAUSE WHERE tu exclue des lignes.

    Le HAVING t'exclu des groupes.

    C'est donc normal que tu n'ais pas les mêmes résultats.
    « Je ne cherche pas à connaître les réponses, je cherche à comprendre les questions. »
    - Confucius -

    Les meilleurs cours, tutoriels et Docs sur les SGBD et le SQL
    Tous les cours Office
    Solutions d'Entreprise



  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 3
    Par défaut
    En effet, le WHERE exclue les lignes et le HAVING exclue les groupes.

    Cependant, ce qui me surprend c'est qu'exclure des lignes suivant certains paramètres ne soit pas la même chose qu'exclure des groupes suivant ces mêmes paramètres après avoir les avoir groupé selon ces paramètres.

    Je ne sais pas si je suis clair :
    Dans un cas j'exlue suivant des conditions à partir de certain champ.
    Dans un autre cas, je groupe selon ces même champ. Puis j'applique les conditions de l'autre cas. Dans le groupage, il n'y a donc pas de perte de ligne dans le groupage.

    Les résultats obtenus ne sont que sensiblement différents.
    Avez-vous une idée sur la provenance de cet écart ?

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 3
    Par défaut
    Après mûre réflexion et quelques tests de plus, je me suis rendu compte à l'évidence : les deux requêtes ne font pas la même opération.

    Peut-être ai-je parlé trop vite, peut-être l'intervention sur ce forum m'a aidé à reconnaître ce fait, peut-être....

    Ce post peut désormais être considéré comme un problème résolu.

    Mesdames et messieurs, désolé d'avoir dû faire ce sujet pour en arrivé à cette conclusion.

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

Discussions similaires

  1. Requête avec Group By utilisation clause where
    Par gcvoiron dans le forum Requêtes
    Réponses: 2
    Dernier message: 27/03/2011, 19h32
  2. Réponses: 16
    Dernier message: 20/01/2011, 12h45
  3. problème de requête avec utilisation de min/group by
    Par htristra dans le forum PostgreSQL
    Réponses: 0
    Dernier message: 02/10/2007, 13h16
  4. Problème avec l'utilisation de la fonction clock
    Par Matgic95 dans le forum C++Builder
    Réponses: 13
    Dernier message: 09/05/2005, 19h27
  5. [SQL] problème avec les date et les group By
    Par Stef784ever dans le forum Langage SQL
    Réponses: 3
    Dernier message: 23/11/2004, 09h18

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