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

SQL Oracle Discussion :

Select MAX d'un count


Sujet :

SQL Oracle

  1. #1
    Candidat au Club
    Inscrit en
    Septembre 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Select MAX d'un count
    Bonjour,
    J'aimerais avoir un coup de main sur la maniére de construire une requête sql;
    je dispose de la table : TRX_jour(trx_id,client_id,magasin_id,type_trx,date_trx).
    je veux extraire pour chaque client son magasin préféré : " sur toute l'année, je fais le count des trx_key par client_id et par magasin_id, exemple :
    Client | Magasin | Count
    ...cli1 | mag10 | 10
    ...cli1 | mag09 | 9
    ...cli1 | mag01 | 20
    ...cli2 | mag10 | 4

    ==> le résultat de ma requête devrait me retourner la 3ème ligne et 4ème ligne.

    jusque là j'ai essayé de résoudre le problème avec le Max(Count())
    select client_id,magasin_id, count(trx_id)
    from TRX_jour
    group by client_id, magasin_id
    having count(trx_key) =
    ( select max(cnt) from
    ( select client_id,magasin_id, count(trx_id) cnt
    from TRX_jour
    where date_TRX between to_date('01/01/2009','DD/MM/YYYY') and to_date('21/12/2009','DD/MM/YYYY')
    and type_TRX = 'N'
    group by client_id,magasin_id
    )
    )

    ==> le soucis c'est que la clause Having sur la count ne me renvoi qu'une seule valeur, et du coup la requête entière me renvoie une seule ligne donc un seul client!!!!!

    Pourriez vous please me suggérer la bonne requête qui me retournera le résultat escompté ?

    Merci d'avance.

  2. #2
    Membre confirmé Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Points : 481
    Points
    481
    Par défaut
    Bonjour,

    Avec les fonctions de fenêtrage, à quelque chose prêt ça doit donner ça :
    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 distinct
        client_id,
        first_value(magasin_id) over (partition by client_id order by cnt desc) as magasin_id
    from
      (select 
        client_id, 
        magasin_id, 
        count(trx_id) as cnt
      from 
        TRX_jour
      group by
        client_id, 
        magasin_id);
    Je penche, donc je suis

  3. #3
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    with count as
    (
      select client_id,magasin_id, count(trx_id)c
      from TRX_jour
      group by client_id, magasin_id
    )
    select 
      client_id,
      max(magasin_id) keep (dense_rank last order by c) magasin_id,
      max(c) count
    from
      count
    group by client_id

  4. #4
    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
    Qu'est-ce que vous voulez comme résultat dans ce cas de figure ?

    Client | Magasin | Count
    ...cli1 | mag10 | 10
    ...cli1 | mag09 | 9
    ...cli1 | mag01 | 20
    ...cli2 | mag10 | 4
    ...cli3 | mag01 | 15
    ...cli3 | mag02 | 15

  5. #5
    Candidat au Club
    Inscrit en
    Septembre 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci à tous pour vos commentaire;
    je suis entrain d'essayer les différentes propositions
    Citation Envoyé par Waldar Voir le message
    Qu'est-ce que vous voulez comme résultat dans ce cas de figure ?
    Client | Magasin | Count
    ...cli1 | mag10 | 10
    ...cli1 | mag09 | 9
    ...cli1 | mag01 | 20
    ...cli2 | mag10 | 4
    ...cli3 | mag01 | 15
    ...cli3 | mag02 | 15
    vous avez mis le doigt sur le cas ou j'étais entrain de me demander comment je vais le résoudre !!

    Pour rester logique sur la demande initial de l'utilisateur, je crois que je devrais avoir comme résultat : ligne 3, ligne5 et les deux lignes 5 et 6.....

    je saais pas, mais j'ai l'impression que ça se complique de plus en plus !!

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    En utilisant une jointure :
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    WITH cnt AS
    (
      SELECT 
            client_id,
            magasin_id, 
            count(trx_id) cnt
      FROM TRX_jour
      GROUP BY 
            client_id, 
            magasin_id
    )
    SELECT 
           cnt.client_id,
           cnt.magasin_id,
           cnt.cnt
    FROM cnt
    JOIN 
         (
          SELECT 
                 client_id,
                 max(cnt) AS cnt
          FROM cnt
          GROUP BY client_id
         ) cntmax
    ON cnt.client_id = cntmax.client_id
    AND cnt.cnt = cntmax.cnt

  7. #7
    Candidat au Club
    Inscrit en
    Septembre 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Merci à tous
    Merci à tous pour vos suggestions et votre aide si précieuse.

    là j'ai pas mal de matière qui me permettra d'affiner un peu plus mes requêtes sur ce projet.

    Encore une fois Merci beaucoup.

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

Discussions similaires

  1. [SQL Server] select max d'un count ?
    Par chess75 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 28/08/2017, 14h38
  2. Problème select max() sur un select count()
    Par totoAussi dans le forum Langage SQL
    Réponses: 6
    Dernier message: 19/02/2015, 01h03
  3. Problème: select max(count())
    Par zizou1989 dans le forum Langage SQL
    Réponses: 12
    Dernier message: 14/05/2013, 16h31
  4. [SQL Server] alternative au SELECT MAX( COUNT(*) )
    Par xtotoro dans le forum Langage SQL
    Réponses: 11
    Dernier message: 24/05/2007, 13h57

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