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 distinct ou group by ne fonctionne pas pour mon besoin


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2009
    Messages : 85
    Points : 62
    Points
    62
    Par défaut Select distinct ou group by ne fonctionne pas pour mon besoin
    Voilà, je veux écrire une requête qui me permet d'avoir plusieurs colonnes tout en conservant l'unicité sur une seule. Voici le contenu de la table "table" pour les champs suivants :

    ID, Article, Description
    AAA | 123 | Crayon
    AAA | 212 | Stylo
    AAV | 321 | Feuilles papier

    J'aimerais un select qui me retourne les trois champs ID, Article et Description et le résultat devrait être le suivant :

    AAA | 123 | Crayon
    AAV | 321 | Feuilles papier

    Donc pour l'occurence AAA, il doit prendre seulement le premier qu'il rencontre lorsque il y a des doublons.

  2. #2
    Rédacteur
    Avatar de jsd03
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2008
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Août 2008
    Messages : 1 221
    Points : 6 506
    Points
    6 506
    Par défaut
    Bonjour et bienvenue,

    Quelle base de données utilises-tu ?

    car sous Oracle j'aurai fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select id, min(article), min(description) keep (dense_rank first order by article)
    from table
    group by id
    Google est ton ami mais ton voisin aussi

    Modérateur BI - Responsable Talend
    Mes tutoriels - FAQ Talend - FAQ SQL*Plus

    Avant toute chose : lire le mode d'emploi du forum et ses règles.
    Suivez @Developpez sur twitter !

  3. #3
    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
    D'autres méthodes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    With MaTable (ID, Article, Descr) AS
    (
    select 'AAA', 123, 'Crayon' union all
    select 'AAA', 212, 'Stylo'  union all
    select 'AAV', 321, 'Feuilles papier'
    )
    select ID, Article, Descr from MaTable
    where Article in (select min(Article) from MaTable group by ID);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select
        ID,
        min(Article) as Article,
        substring(min(cast(Article as varchar(3)) + Descr), len(min(Article))+1, max(len(Descr))) as Descr
    from MaTable
    group by ID;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select ID, Article, Descr
    from
    (
    select ID, Article, Descr, row_number() over(partition by ID order by Article ASC) rk
    from MaTable
    ) SR
    where rk = 1;

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2009
    Messages : 85
    Points : 62
    Points
    62
    Par défaut Presque !
    Alors après exécution de ta requête sur mes données j'obtiens ceci :

    Id , Article, Description
    AAA | 212 | Stylo
    AAV | 321 | Feuilles papier

    Alors que je veux plutôt,

    AAA | 123 | Crayon
    AAV | 321 | Feuilles papier

    On dirait qu'il prends le dernier !

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2009
    Messages : 85
    Points : 62
    Points
    62
    Par défaut
    Oui, oui c'est bien Oracle 10g R2.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2009
    Messages : 85
    Points : 62
    Points
    62
    Par défaut C'est bon. Merci Waldar j'ai adapté l'une de tes requêtes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT id, article, description
    FROM
    (
    SELECT id, article, description, row_number() over(partition BY id ORDER BY desciption desc, article DESC) rk
    FROM table
    ) SR
    WHERE rk = 1;
    Ceci répond parfaitement à mes besoins merci Waldar!

  7. #7
    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
    La solution la plus performante ce sera la syntaxe avec keep.

    Je ne comprends pas pourquoi vous n'avez pas le bon résultat avec la requête de jsd03 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    WITH MaTable AS
    (
    SELECT 'AAA' as ID, 123 as Article, 'Crayon' as Descr from dual union all
    SELECT 'AAA'      , 212           , 'Stylo'           from dual union all
    SELECT 'AAV'      , 321           , 'Feuilles papier' from dual
    )
      SELECT ID, min(Article) as Article,
             min(Descr) keep (dense_rank first order by article asc) as Descr
        FROM MaTable
    GROUP BY ID;
     
    ID	ARTICLE	DESCR
    AAA	123	Crayon
    AAV	321	Feuilles papier

  8. #8
    Rédacteur
    Avatar de jsd03
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2008
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Août 2008
    Messages : 1 221
    Points : 6 506
    Points
    6 506
    Par défaut
    Hum oui moi non plus en faite car j'avais testé et ça fonctionnait parfaitement...
    Google est ton ami mais ton voisin aussi

    Modérateur BI - Responsable Talend
    Mes tutoriels - FAQ Talend - FAQ SQL*Plus

    Avant toute chose : lire le mode d'emploi du forum et ses règles.
    Suivez @Developpez sur twitter !

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2009
    Messages : 85
    Points : 62
    Points
    62
    Par défaut
    C'est peut-être parce que mon exemple ne reflétait pas exactement les types de données sans doute. Dans l'ordre j'ai un varchar2(3), un varchar(20) et un number(1). C'est ce petit dernier qui fait la différence. Il prends les valeurs 0 ou 1, style 0=>inactif et 1=>actif. J'ai besoin de celui qui est actif donc 1 s'il y a. Voilà, j'espère que j'ai pu répondre à votre incompréhension. Merci encore à tous les deux.

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

Discussions similaires

  1. [AC-2010] Clause GROUP BY ne fonctionne pas
    Par madjon6 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 18/01/2012, 19h05
  2. [Nexus] - Groupes public ne fonctionnent pas
    Par ego dans le forum Intégration Continue
    Réponses: 1
    Dernier message: 17/09/2011, 09h35
  3. Group by ne fonctionne pas
    Par webfranc dans le forum SQL
    Réponses: 10
    Dernier message: 07/05/2008, 14h30
  4. A:hover ne fonctionne pas pour mon menu css
    Par kaylah dans le forum Mise en page CSS
    Réponses: 5
    Dernier message: 13/03/2007, 15h02
  5. Réponses: 13
    Dernier message: 20/07/2004, 08h54

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