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 :

Faire ressortir les données avec le plus de volumes


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Inscrit en
    Juin 2010
    Messages
    358
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 358
    Points : 77
    Points
    77
    Par défaut Faire ressortir les données avec le plus de volumes
    Bonjour,

    Je cherche à constituer un fichier contenant les infos suivantes sur des véhicules :

    -marque
    -modèle
    -segment
    -type

    Le problème est que la base contient des données parfois erronées au niveau du segment et du type.
    Ces données étant plutôt minoritaires, il me suffirait de n'en retenir que les majoritaires.

    La requête que j'utilise se présente comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select distinct marque, modele, segment, type, count (*)
    from table_vehicules
    where MARQUE is not null
    and segment <> 'IN'
    and TYPE_CAISSE <> 'IN'
    group by marque, modele, segment, type
    order by 1, 2, 3, 4
    ;

    Elle m'affiche un résultat du type:

    MARQUE MODELE SEGMENT TYPE COUNT (*)
    MARQUE1 MODELE1 A B 2
    MARQUE1 MODELE1 B B 2 228
    MARQUE1 MODELE1 D H 2 842


    Idéalement, je souhaiterais modifier ma requête pour qu'elle ne m'affiche que la ligne contenant le plus de véhicules (2 842) contenant les mêmes données, à savoir :

    MARQUE MODELE SEGMENT TYPE
    MARQUE1 MODELE1 D H


    Est-ce quelqu'un aurait des idées ?

    Merci.
    Microsoft SQL Server Management Studio v17.9.1

  2. #2
    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
    Quelque chose comme ç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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    with    liste
        as  (   select  marque
                    ,   modele
                    ,   segment
                    ,   type
                    ,   count (*)   as nb
                from    table_vehicules
                where   marque  is not null
                    and segment <> 'IN'
                    and type_caisse <> 'IN'
                group by marque
                    ,   modele
                    ,   segment
                    ,   type
            )
    select  marque
        ,   modele
        ,   segment
        ,   type
        ,   nb
    from    liste   as  lst
    where   exists
            (   select  null
                from    liste   as sel
                having  lst.nb  = max(sel.nb)
            )
    ;
    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.

  3. #3
    Membre régulier
    Inscrit en
    Juin 2010
    Messages
    358
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 358
    Points : 77
    Points
    77
    Par défaut
    Merci pour la réponse rapide.
    Je rencontre par contre une erreur "ORA-00933: la commande SQL ne se termine pas correctement" au niveau d'un "as" :

    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
    27
    with    liste
        as  (   select   MDM_PART.V_MDM_VEH.VE_MARQUE as marque, 
                        MDM_PART.V_MDM_VEH.VE_MODELE as modele,  
                        MDM_PART.V_MDM_VEH.VE_SEG_EUR as segment_europeen, 
                        MDM_PART.V_MDM_VEH.VE_TYPE_CAISSE as type_caisse, 
                    count (*)   as nb
                from    MDM_PART.V_MDM_VEH
                where   MDM_PART.V_MDM_VEH.VE_MARQUE  is not null
                    and MDM_PART.V_MDM_VEH.VE_SEG_EUR <> 'IN'
                    and MDM_PART.V_MDM_VEH.VE_TYPE_CAISSE <> 'IN'
                group by MDM_PART.V_MDM_VEH.VE_MARQUE
                    ,   MDM_PART.V_MDM_VEH.VE_MODELE
                    ,   MDM_PART.V_MDM_VEH.VE_SEG_EUR
                    ,   MDM_PART.V_MDM_VEH.VE_TYPE_CAISSE
            )
    select  MDM_PART.V_MDM_VEH.VE_MARQUE
                    ,   MDM_PART.V_MDM_VEH.VE_MODELE
                    ,   MDM_PART.V_MDM_VEH.VE_SEG_EUR
                    ,   MDM_PART.V_MDM_VEH.VE_TYPE_CAISSE,
                        nb
    from    liste   as  lst
    where   exists
            (   select  null
                from    liste   as sel
                having  lst.nb  = max(sel.nb)
            )
    ;
    Microsoft SQL Server Management Studio v17.9.1

  4. #4
    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
    C'est sans doute que tu utilises un SGBD qui ne prend pas en charge les expressions de table.
    Mais comme tu n'as pas précisé lequel, ni sa version, la réponse que j'ai proposée se base sur le langage SQL normalisé.
    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.

  5. #5
    Membre régulier
    Inscrit en
    Juin 2010
    Messages
    358
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 358
    Points : 77
    Points
    77
    Par défaut
    Effectivement...
    Je suis sous oracle et voici ce que j'ai trouvé pour la version :

    Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
    PL/SQL Release 11.2.0.4.0 - Production
    Microsoft SQL Server Management Studio v17.9.1

  6. #6
    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
    Comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    with cte_agg as
    (
      select marque, modele, segment, type
           , row_number() over (partition by marque, modele order by count(*) desc) as rn
        from table_vehicules
       where marque      is not null
         and segment     <> 'IN'
         and type_caisse <> 'IN'
    group by marque, modele, segment, type
    )
    select marque, modele, segment, type
      from cte_agg
     where rn = 1;

  7. #7
    Membre régulier
    Inscrit en
    Juin 2010
    Messages
    358
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 358
    Points : 77
    Points
    77
    Par défaut
    Merci beaucoup, cela fonctionne parfaitement.
    Microsoft SQL Server Management Studio v17.9.1

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 29/06/2017, 22h49
  2. [XL-2010] Graphe - Faire ressortir les données en anomalie
    Par Daejung dans le forum Excel
    Réponses: 2
    Dernier message: 14/10/2015, 09h19
  3. Réponses: 1
    Dernier message: 12/09/2006, 14h44
  4. Faire "remonter" les données dans des requetes imbriquées
    Par Earthwormjim dans le forum Requêtes
    Réponses: 5
    Dernier message: 30/08/2006, 17h37
  5. Mettre à jour les données avec un ADODC
    Par ecarbill dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 25/08/2006, 20h41

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