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 :

GROUP BY et LIMIT clauses associées


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 28
    Points : 17
    Points
    17
    Par défaut GROUP BY et LIMIT clauses associées
    Bonjour,

    A partir d'une table groupe, et des champs établissements et brut_soumis, je dois calculer la somme des 10 plus hauts salaires par établissement.
    J'aimerais le faire en une seule requête mais j'avoue que je sèche.

    voici une 1ere requête pour récupérer la liste des établissements :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT `etablissement` FROM `groupe` GROUP BY `etablissement` ORDER BY `etablissement` asc
    et une 2eme pour effectuer le calcul mais sur un établissement en particulier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT `etablissement`, ROUND(SUM(`brut_soumis`), 2) 
    FROM (SELECT `etablissement`, `brut_soumis` FROM `groupe` WHERE `etablissement` LIKE '%600001%' ORDER BY cast(`brut_soumis` as signed) desc LIMIT 10) GRP
    Comment pourrais-je faire pour en quelque sorte fusionner les deux ?

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Vu la syntaxe particulière de votre requete, je suppose que vous utilisez MySQL, c'est bien le cas ?
    La solution peut être différente en fonction du SGBD

  3. #3
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Et bêtement ainsi ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT `etablissement`, ROUND(SUM(`brut_soumis`), 2) FROM (SELECT `etablissement`, `brut_soumis` FROM `groupe` ORDER BY cast(`brut_soumis` as signed) desc LIMIT 10) GRP
    Emérite, émérite je ne pense pas ... plutôt dans le développement depuis FORT FORT longtemps, c'est mon job, ça oui
    A part ça ... Il ne pleut jamais en Moselle !

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Le problème de LIMIT est qu'il ne limite pas la recherche, mais seulement la restitution.
    Si c'est bien du MYSQL, pas de fonction de fenêtrage possible, il faut donc utiliser une requete avec une table dérivée et une autojointure

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 28
    Points : 17
    Points
    17
    Par défaut
    J'utilise bien MYSQL en effet.

    vttman, votre solution ne m'affiche qu'une ligne et ne me permet pas de grouper les réponses par établissement

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 28
    Points : 17
    Points
    17
    Par défaut
    Comment puis-je utiliser une requete avec une table dérivée et une autojointure ?

  7. #7
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Il y a un SUM ? qui me tracasse (et donc je me demande l'utilité, y aurait t'il plusieurs fois le même établissement dans la table groupe ? )
    et j'ai déplacé le LIMIT 10 à une place plus appropriée à mon sens

    A Réessayer ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT `etablissement`, ROUND(`brut_soumis`, 2) FROM (SELECT `etablissement`, `brut_soumis` FROM `groupe` ORDER BY cast(`brut_soumis` as signed) desc ) GRP LIMIT 10
    Note : Sans jeu d'essai, je ne pourrai guère proposer plus sur ce sujet ... et je laisse la place aux experts du forum
    Emérite, émérite je ne pense pas ... plutôt dans le développement depuis FORT FORT longtemps, c'est mon job, ça oui
    A part ça ... Il ne pleut jamais en Moselle !

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par percevalseb Voir le message
    Comment puis-je utiliser une requete avec une table dérivée et une autojointure ?
    Vous pouvez vous inspirer de ce sujet : http://www.developpez.net/forums/d16...e/#post8872652

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    On peut peut-être s'en sortir ainsi:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select g1.etablissement,g1.brut_soumis,count(*)
    from groupe as g1
    inner join groupe as g2 on g1.brut_soumis >= g2.brut_soumis
    group by g1.etablissement,g1.brut_soumis
    having count(*) <= 10
    order by 1,3
    Il faut juste vérifier ce que ça donne avec des ex-aequo...

    Tatayo.

    Edit: il manquait le brut dans la requête...

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 28
    Points : 17
    Points
    17
    Par défaut
    Il y a en effet plusieurs lignes, à savoir environ 150000, chacune d'entre elle correspond à un salarié.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 28
    Points : 17
    Points
    17
    Par défaut
    tatayo, quand je teste votre requête sur le plesk, ça plante, elle doit être trop gourmande en ressource

    Je rappelle que je dois faire la somme des 10 plus hauts salaires par établissement, d'où l'utilisation de SUM() dans ma 2eme requête.

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

Discussions similaires

  1. [Toutes versions] Récupération des groupes (favoris) et Requêtes associées
    Par Dr Byby'San dans le forum VBA Access
    Réponses: 6
    Dernier message: 13/08/2012, 22h22
  2. Réponses: 3
    Dernier message: 08/03/2007, 10h53
  3. Limiter le nombre d'enregistrements par groupe
    Par atoff dans le forum Access
    Réponses: 2
    Dernier message: 10/01/2007, 09h26
  4. Association ORDER BY/GROUP BY...
    Par JeremieT dans le forum Langage SQL
    Réponses: 7
    Dernier message: 13/01/2006, 16h49
  5. [limit] obtenir n groupe de rows
    Par azmodai dans le forum Langage SQL
    Réponses: 7
    Dernier message: 26/10/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