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 :

Max d'un count avec alias


Sujet :

Langage SQL

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 18
    Points : 7
    Points
    7
    Par défaut Max d'un count avec alias
    Bonjour

    Voici mon problème :
    Si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT count(id_vehicule), contact.nom_contact
    FROM contact, vehicule
    WHERE contact.id_contact = vehicule.id_contact
    AND categorie_contact = 'concession etrangere'
    GROUP BY contact.nom_contact
    Réponse
    Count(id_vehicule) nom_contact
    5 Mc Donald
    1 Spaghetti
    Ce que je souhaite obtenir c'est uniquement la ligne Mc Donald où le nombre est maximum. J'ai donc fais une requete avec un max mais ça ne fonctionne pas. Voici la requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT contact.nom_contact 
    from contact, 
    (
    select count(id_vehicule), contact.nom_contact 
    FROM contact, vehicule
    where contact.id_contact = vehicule.id_contact
    AND categorie_contact = 'concession etrangere'
    GROUP BY contact.nom_contact 
    ) as c2
    WHERE contact.nom_contact = (select max(count(id_vehicule)) 
                                from contact, vehicule 
                                group by contact.nom_contact)
    j'ai comme message d'erreur : utilisation invalide de la clause group.
    J'ai fais plusieurs manipulation avec ou sans les alias, et j'ai toujours des erreurs.
    Quelqu'un peut-il m'aider ?
    Merci

  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 : 44
    Localisation : France, Rhône (Rhône Alpes)

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

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

    Il doit manquer le "contact.nom_contact"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SELECT contact.nom_contact 
    FROM contact, 
    (
    SELECT count(id_vehicule), contact.nom_contact 
    FROM contact, vehicule
    WHERE contact.id_contact = vehicule.id_contact
    AND categorie_contact = 'concession etrangere'
    GROUP BY contact.nom_contact 
    ) AS c2
    WHERE contact.nom_contact = (SELECT max(count(id_vehicule))
                                       , contact.nom_contact 
                                 FROM contact, vehicule 
                                 GROUP BY contact.nom_contact)
    « 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
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Non Cthulus ça ne fonctionnera pas, on ne peut pas demander à un champ d'être égal à un couple.

    Sous quel SGBD êtes-vous ?

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 280
    Points : 11 736
    Points
    11 736
    Par défaut
    Je ne vois pas à quoi sert la table vehicule dans ton exemple ?
    Ne faudrait-il pas utiliser un COUNT(DISTINCT id_vehicule) ?

    A ces deux questions près, voici une solution générique (où je remplace = MAX par >= ALL) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT contact.nom_contact, count(id_vehicule)
    FROM contact
    WHERE categorie_contact = 'concession etrangere'
    GROUP BY contact.nom_contact
    HAVING count(id_vehicule) >= ALL (
      SELECT count(id_vehicule)
      FROM contact
      WHERE categorie_contact = 'concession etrangere'
      GROUP BY contact.nom_contact
    )
    Selon le SGBD, il y a des solutions plus simples avec un fenêtrage. Par exemple, avec MySQL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT contact.nom_contact, count(id_vehicule)
    FROM contact
    WHERE categorie_contact = 'concession etrangere'
    GROUP BY contact.nom_contact
    ORDER BY count(id_vehicule) DESC
    LIMIT 1
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Citation Envoyé par Antoun Voir le message
    Je ne vois pas à quoi sert la table vehicule dans ton exemple ?
    Il y a de sérieuses chances que "id_vehicule" soit une colonne de la table "Vehicule".

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

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonjour @Waldar , @Antoun ,

    Effectivement voilà ce que c'est que de faire plusieurs choses en même temps...

    J'étais partie, pour un TOP 1 mais @Antoun à déjà répondu !
    Il n'y aura plus qu'a adapter suivant le SGBDR.

    « 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



  7. #7
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 280
    Points : 11 736
    Points
    11 736
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Il y a de sérieuses chances que "id_vehicule" soit une colonne de la table "Vehicule".
    en fait, j'ai cru que la jointure se faisait sur l'id_vehicule... chuis pas réveillé.

    Ça donne les requêtes suivantes. En générique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT contact.nom_contact, count(id_vehicule)
    FROM contact
      INNER JOIN vehicule ON contact.id_contact = vehicule.id_contact
    WHERE categorie_contact = 'concession etrangere'
    GROUP BY contact.nom_contact
    HAVING count(id_vehicule) >= ALL (
      SELECT count(id_vehicule)
      FROM contact
          INNER JOIN vehicule ON contact.id_contact = vehicule.id_contact
      WHERE categorie_contact = 'concession etrangere'
      GROUP BY contact.nom_contact
    )
    En MySQL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT contact.nom_contact, count(id_vehicule)
    FROM contact
      INNER JOIN vehicule ON contact.id_contact = vehicule.id_contact
    WHERE categorie_contact = 'concession etrangere'
    GROUP BY contact.nom_contact
    ORDER BY count(id_vehicule) DESC
    LIMIT 1
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 18
    Points : 7
    Points
    7
    Par défaut
    merci ça marche.
    maintenant j'ai ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT consulter.id_contact, nom_contact,date_consult
    FROM contact,consulter
    WHERE consulter.id_contact=contact.id_contact
    AND categorie_contact='concession etrangere'
    AND datediff(curdate(),date_consult)<=31;
    j'obtiens les contacts qui ont consulté les véhicules et la date de consultation.
    Si je veux connaitre le nom du contact qui s'est connecté le plus de fois au cours du dernier mois, il me faut encore un max. Même problème donc.

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 18
    Points : 7
    Points
    7
    Par défaut
    J'ai essaye de faire avec ce qui m'a été expliqué.
    Voici le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT contact.nom_contact, count(consulter.id_contact)
    FROM contact
    INNER JOIN consulter ON contact.id_contact = consulter.id_contact
    WHERE categorie_contact = 'concession etrangere'
    GROUP BY contact.nom_contact
    ORDER BY count(consulter.id_contact) DESC
    LIMIT 1
    j'obtiens une partie de ce que je veux. J'ai en effet une contrainte de date et je n'arrive pas à l'insérer : au cours du dernier mois que je traduis par
    datediff(curdate(),date_consult)<=31
    quelqu'un peut-il m'aider ? merci

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 18
    Points : 7
    Points
    7
    Par défaut
    c'est bon j'ai trouvé, il suffisait de rajouter une info dans le group by
    merci à tous

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

Discussions similaires

  1. Problème de Count() avec valeur Max
    Par HelpJulien dans le forum QlikView
    Réponses: 1
    Dernier message: 24/05/2012, 17h11
  2. Requete select count(*) avec having max()
    Par Goupo dans le forum Langage SQL
    Réponses: 10
    Dernier message: 09/03/2009, 12h50
  3. max(count(*)) avec un GROUP BY (suite)
    Par awalter1 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 12/09/2007, 15h07
  4. max(count(*)) avec un GROUP BY
    Par awalter1 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 12/09/2007, 11h04
  5. problème count avec la valeur 0
    Par cristolb dans le forum Langage SQL
    Réponses: 8
    Dernier message: 28/07/2005, 09h39

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