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 :

Requete select count(*) avec having max()


Sujet :

Langage SQL

  1. #1
    Membre actif Avatar de Goupo
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 505
    Points : 229
    Points
    229
    Par défaut Requete select count(*) avec having max()
    Salut à tous,

    J'ai un soucis avec une requête qui comporte un count(*) et un having max().

    Ma requête est à la base la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select L.controle, R.etat, R.dateExec
    from ListeControles L, SyntheseResultat R, Campagne C 
    where L.campagne = C.codeCamp 
         and L.controle = R.controle 
         and L.campagne like 'ALM' 
         and R.etat = 1 
    having max(R.dateExec)
    Comme attendu, cette requête me renvoie 1 seule ligne et lorsque je supprime la clause having, elle m'en renvoie 5.

    Cependant lorsque je change ma clause select (en conservant ma clause having!) pour que ma requête me renvoie le nombre de lignes trouvées, elle me renvoie 5.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select count(*)
    from ListeControles L, SyntheseResultat R, Campagne C 
    where L.campagne = C.codeCamp 
         and L.controle = R.controle 
         and L.campagne like 'ALM' 
         and R.etat = 1 
    having max(R.dateExec)
    Qui peut me dire où je me trompe?

    Merci d'avance!

  2. #2
    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 394
    Points
    18 394
    Par défaut
    Je suis très étonné que l'une ou l'autre de vos requêtes retourne un résultat car elles sont fausses.

    Quel est votre SGBD ?

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 115
    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 115
    Points : 28 493
    Points
    28 493
    Par défaut
    Quel SGBD utilises-tu ?
    Parce que, théoriquement, avec un interpréteur SQL respectant les normes du langage, HAVING demande une expression logique (le plus souvent une comparaison), pas une expression numérique...

  4. #4
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Plusieurs choses ne vont pas dans cette requête...

    1) HAVING est une clause qui s'emploie conjointement avec la clause GROUP BY. C'est en fait un WHERE qui s'opère sur le résultat d'un calcul sur le regroupement.

    2) LIKE sans caractère générique est équivalent à =

    3) La syntaxe normalisée des jointures est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FROM tableA
    JOIN tableB ON condition de jointure
    La requête ci-dessous vous retournera le nombre de lignes de ListeControles dont la campagne commence par ALM et dont l'état du résultat est égal à 1.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT count(*)
    FROM ListeControles L
    INNER JOIN SyntheseResultat R ON L.controle = R.controle 
    INNER JOIN Campagne C ON L.campagne = C.codeCamp
    WHERE L.campagne LIKE '%ALM' 
         AND R.etat = 1
    C'est ce qui est recherché comme résultat ?

  5. #5
    Membre actif Avatar de Goupo
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 505
    Points : 229
    Points
    229
    Par défaut
    Je suis très étonné que l'une ou l'autre de vos requêtes retourne un résultat car elles sont fausses.

    Quel est votre SGBD ?
    Et moi je suis étonné de votre étonnement... Après vérification (copier/coller de chacune des requêtes depuis ici à MySQL Browser puis exécution), j'ai en effet une ligne qui sort de cette requête.

    Je suis sur une base MySQL, j'utilise le moteur de stockage InnoDB.

    J'ai pris compte de vos remarques. J'ai appliqué un group by et j'ai remplacé mon Like par l'opérateur =. Comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT count(*)
    FROM 
    INNER JOIN SyntheseResultat R ON L.controle = R.controle 
    INNER JOIN Campagne C ON L.campagne = C.codeCamp
    WHERE L.campagne = 'ALM'
    AND R.etat = 1
    GROUP BY R.controle
    HAVING max(R.dateExec)
    Mais mon problème persiste.

    J'ai cependant réussi à contourner le problème via un distinct, je crois que c'est ce que j'aurai du faire dès le départ, comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select count(distinct R.controle)
    from 
    inner join SyntheseResultat R on L.controle = R.controle 
    inner join Campagne C on L.campagne = C.codeCamp
    where etat = 1
    and C.codeCamp like 'ALM'
    Alors je ne sais pas si poursuivre la discussion sera constructif étant donné que le problème vient de moi : Je ne sais pas utiliser la clause Having, de plus, je ne suis pas au point sur les jointures.

    Qu'en pensez-vous? Le sujet est clos?

  6. #6
    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 394
    Points
    18 394
    Par défaut
    le pourcentage à droite

  7. #7
    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 394
    Points
    18 394
    Par défaut
    Citation Envoyé par Goupo Voir le message
    Alors je ne sais pas si poursuivre la discussion sera constructif étant donné que le problème vient de moi : Je ne sais pas utiliser la clause Having, de plus, je ne suis pas au point sur les jointures.

    Qu'en pensez-vous? Le sujet est clos?
    Si vous nous disiez ce que vous attendez comme résultat on pourra mieux vous aider.
    Si vous voullez baisser les bras dès que vous rencontrez ce genre de difficulté sémantique triviale, libre à vous, mais ce ne sera pas le bon choix.
    Le mieux étant de comprendre ce qu'on a pas compris et de comprendre pourquoi on n'a pas compris.

  8. #8
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 115
    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 115
    Points : 28 493
    Points
    28 493
    Par défaut
    est l'équivalent en SQL de
    Quelle est la différence entre un corbeau ?

  9. #9
    Membre actif Avatar de Goupo
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 505
    Points : 229
    Points
    229
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    est l'équivalent en SQL de
    Quelle est la différence entre un corbeau ?
    Vous voulez dire que mon having devrait plutôt ressembler plutôt à ceci?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    having R.dateExec = max(R.dateExec)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Si vous voullez baisser les bras dès que vous rencontrez ce genre de difficulté sémantique triviale, libre à vous, mais ce ne sera pas le bon choix. Le mieux étant de comprendre ce qu'on a pas compris et de comprendre pourquoi on n'a pas compris.
    Je n'ai pas compris coment utiliser la clause Having et les différentes jointures, que je pensais avoir compris avant maintenant. Je lis souvent ici qu'il s'agit d'un forum d'entraide et non de cours d'informatique (avis que je partage). Et à vrai dire, je pensais aller trouver de la documentation sur le sujet putôt que vous m'expliquiez quelque chose qui est déjà écrit sur de multiples supports...

  10. #10
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par Goupo Voir le message
    Et à vrai dire, je pensais aller trouver de la documentation sur le sujet putôt que vous m'expliquiez quelque chose qui est déjà écrit sur de multiples supports...
    Alors un tour par les cours SQL s'impose...
    Bon courage !

  11. #11
    Membre actif Avatar de Goupo
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 505
    Points : 229
    Points
    229
    Par défaut
    J'y étais déjà.

    Merci!

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 03/05/2012, 19h15
  2. Select avec "having max" sur chp date
    Par Adel_mana dans le forum Langage SQL
    Réponses: 5
    Dernier message: 14/08/2009, 13h01
  3. erreur requete select count
    Par offspring dans le forum C#
    Réponses: 14
    Dernier message: 16/05/2008, 20h36
  4. Requete SELECT Count(x)/Count(y)
    Par ahage4x4 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 21/06/2006, 16h26
  5. Requete select imbriqués avec plusieurs références
    Par GAlion dans le forum Langage SQL
    Réponses: 4
    Dernier message: 06/08/2004, 15h06

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