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 :

MIN + Count+ requête sql


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2013
    Messages : 16
    Points : 13
    Points
    13
    Par défaut MIN + Count+ requête sql
    Bonjour , je cherche à savoir comment je peux faire pour avoir le client qui a le moins d'affectations , et cela à partir d'une seul requête , j'ai fait comme ceci mais il me donne chaque client combien il a d'affectations c'est tout

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT backoffice_users_id, idsous_risques, COUNT( idaffectations ) 
    FROM affectations
    WHERE idsous_risques =1
    GROUP BY backoffice_users_id

  2. #2
    Membre éclairé
    Profil pro
    maçon
    Inscrit en
    Novembre 2004
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : maçon

    Informations forums :
    Inscription : Novembre 2004
    Messages : 265
    Points : 679
    Points
    679
    Par défaut
    Votre requête ne retournera pas un enregistrement unique car il y a de fortes chances qu'il y ait plusieurs clients avec un même minimum d'affectation.
    Si vous ajouter un order by asc sur idaffectations vous aurez un classement du plus petit au plus grand. Après et en fonction de votre base sql (oracle, mysql,sql server informix ...) vous pouvez ne prendre que le premier enregistrement ainsi pour une base informix ça pourrait donner ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT first 1 backoffice_users_id, idsous_risques, COUNT( idaffectations ) 
    FROM affectations
    WHERE idsous_risques =1
    GROUP BY backoffice_users_id
    [COLOR="Red"]order by 3 asc /COLOR]
    Pour Oracle il faut utiliser Limit (syntaxe à vérifier)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT first 1 backoffice_users_id, idsous_risques, COUNT( idaffectations ) 
    FROM affectations
    WHERE idsous_risques =1
    GROUP BY backoffice_users_id
    order by 3 asc limit 1 

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    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 080
    Points : 30 789
    Points
    30 789
    Par défaut
    Posée telle quelle, ta requête devrait générer une erreur d'exécution dans la majorité des SGBD (ceux qui s'approchent de la norme).
    En effet, toutes les colonnes de la clause SELECT qui ne font pas l'objet d'une fonction de regroupement devraient être présentes dans la clause GROUP BY, ce qui n'est pas le cas de ta colonne idsous_risques.

    Ensuite si ton SGBD accepte les expressions de table, ta requête s'écrira simplement ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    WITH    comptage
        AS  (   SELECT  aff.backoffice_users_id
                    ,   aff.idsous_risques
                    ,   COUNT(aff.idaffectations)   AS compte 
                FROM    affectations    aff
                WHERE   aff.idsous_risques = 1
                GROUP BY aff.backoffice_users_id
                    ,   aff.idsous_risques
            )
    SELECT  det.backoffice_users_id
    FROM    comptage    det
    WHERE   det.compte  IN
                (   SELECT  MIN(sel.compte)
                    FROM    comptage    sel
                )
    ;
    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.

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

Discussions similaires

  1. Requête SQL count
    Par rednight dans le forum WinDev
    Réponses: 4
    Dernier message: 05/06/2009, 14h20
  2. [MySQL] Requête SQL avec un Count.
    Par Requiem11 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 11/05/2009, 11h01
  3. [Problème SQL] Sum, Count + requête imbriquée
    Par Lolie11 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 06/01/2009, 18h08
  4. Récupérer le résultat d'une requête SQL (count)
    Par niano dans le forum VBA Access
    Réponses: 6
    Dernier message: 07/09/2007, 11h41
  5. Problème de requête SQL avec DISTINCT et COUNT ?
    Par [ZiP] dans le forum Langage SQL
    Réponses: 4
    Dernier message: 29/01/2007, 17h11

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