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 :

Combiner Group By et MAX


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 11
    Par défaut Combiner Group By et MAX
    Bonjour,
    je n'arrive pas à obtenir le bon résultat pour une requête que voici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT * , MAX( `legis_2012_resultats_T2`.`voix` )
    FROM `legis_2012_resultats_T2`
    GROUP BY `legis_2012_resultats_T2`.`id_circon`
    HAVING 
    `legis_2012_resultats_T2`.`voix` = MAX( `legis_2012_resultats_T2`.`voix` )
    Voici la table(`legis_2012_resultats_T2`) en question (extrait)

    id_circon id_candidat sexe nom prenom nuance voix
    100_1 100_1_2 M SAID Boinali DVG 9653
    100_1 100_1_3 M OMAR OILI Saïd DVG 6707
    100_2 100_2_1 M ABOUBACAR Ibrahim SOC 12846
    100_2 100_2_11 M KAMARDINE Mansour UMP 10532
    101_1 101_1_5 M YANNO Gaël UMP 14811
    101_1 101_1_6 F LAGARDE Sonia DVD 17340

    Désolé, je vois pas comment insérer la table proprement.

    Exposé du pb : la requête ci-dessus cherche à obtenir le candidat qui a obtenu le plus de voix dans sa circonscription ==> le GROUP BY id_circon et le HAVING MAX .
    MAIS si le maximum n'est pas sur la 1° ligne de la id_circon rien ne sort .
    Bref :
    pour l'id_circon 100_1 ==> ça marche
    pour l'id_circon 100_2 ==> ça marche
    pour l'id_circon 101_2 ==> ça ne marche pas

    J'en appelle donc à vous lumières.
    Merci d'avance.

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 185
    Par défaut
    Bonjour,

    Quelle est ta BDD? Essaie qqch du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT *
    FROM (
    SELECT *, row_number() over (partition by `legis_2012_resultats_T2`.`id_circon` order by `legis_2012_resultats_T2`.`voix` desc) rn
    FROM FROM `legis_2012_resultats_T2`
    )
    WHERE rn = 1;

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 11
    Par défaut
    Merci,
    je suis sur un serveur MySQL

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 11
    Par défaut
    J'ai testé mais cela m'indique une erreur :

    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(partition by `legis_2012_resultats_T2`.`id_circon` order by `legis_2012_resulta' at line 3

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    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 144
    Par défaut
    Escartefigue a rédigé un excellent article de blog sur ce sujet : Selectionner la ligne la plus récente pour un critère.
    Ce n'est pas sur une date que tu fais ta sélection, mais le principe est le même.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 11
    Par défaut
    j'ai une solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT *, MAX(`voix`)
    FROM
    (
    SELECT *
    FROM `legis_2012_resultats_T2`	
    order by  `id_circon`, `voix` DESC
    ) as latab
    GROUP BY `id_circon`
    Merci vanagreg ne m'avoir mis sur la voie du tri, je n'y avais pas pensé. Mais bon cela ne m'explique pas pourquoi mon code initial ne fonctionne pas.
    En fait ici j'utilise le défaut que je signalais (je ne récupère que la 1° ligne de chaque id_circon) grâce au tri décroissant la 1° ligne est toujours la bonne.

  7. #7
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 586
    Par défaut
    Attention,
    Avec un select * et une fonction d'agrégation, le résultat dépend du bon vouloir de MySQL, puisqu'on ne sait pas quelle valeur doit être gardée pour les colonnes qui ne sont pas dans le GROUP BY et qui ne font pas l'objet d'une fonction d'agrégation (min, max...)
    Et surtout la liste des colonnes renvoyées changera en cas de modification du schéma, l'ajout d'une jointure...
    D'ailleurs seul MySQL accepte ce genre de requête, qui est systématiquement rejetée par n'importe quel autre SGBD.

    Tatayo.

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

Discussions similaires

  1. Combinaison de Group By et max
    Par santana2006 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 07/04/2008, 00h56
  2. Somme Group by et Max date
    Par mamiberkof dans le forum Langage SQL
    Réponses: 5
    Dernier message: 03/04/2008, 16h48
  3. access 2003 group by et max
    Par Bba_M dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 29/01/2008, 15h00
  4. pb GROUP BY et max()
    Par wac9258 dans le forum Requêtes
    Réponses: 1
    Dernier message: 27/03/2007, 19h56
  5. [SQL2005] group by et max(date)
    Par BOUBOU81 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 11/12/2006, 16h54

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