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 :

[Oracle] group by, decode, et distinct


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Points : 84
    Points
    84
    Par défaut [Oracle] group by, decode, et distinct
    Bonjour,

    J'ai une requête SQL comportant des decode et un group by que voici :

    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
     
    SELECT DISTINCT 
           produits.id_produit, 
           decode(magasin_id, 1, decode(langue_id, 1, description), 
                                 3, decode(langue_id, 1, description),
                                 5, decode(langue_id, 1, description)
            ) as description_francaise,
           decode(langue_id, 3, description) as description_espagnole
    FROM 
           produits,
           magasins,
           langues
    WHERE 
           -- les bonnes jointures
    GROUP BY 
           -- ce qu'il faut
    ORDER BY 
           id_produit;
    Mon but est d'afficher, pour un produit, les descriptions entrées dans différentes langues (pour le francais il faut prendre en compte le magasin, bref).

    Or j'obtiens ce résultat :



    alors que je ne voudrais qu'une seule ligne :



    Est-ce que qulqu'un a une idée pour m'aider ?

    D'avance merci !!!!

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour, j'avoue que je ne comprend pas ce decode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    decode(magasin_id, 1, decode(langue_id, 1, description), 
                                 3, decode(langue_id, 1, description),
                                 5, decode(langue_id, 1, description)
            ) AS description_francaise,
    S'il fait ce que je comprend il te renvoie decode(langue_id, 1, description) si ton magasin_id est 1,3,5.
    Est-ce ce que tu veux?

    En admettant que oui, il me semble que tu devrais mettre ta table langue deux fois pour avoir les descriptions en français et en espagnol. J'ai supposé que les description se trouvaient dans la table langue mais peut être que ce n'est pas cela car sans la structure de tes tables et tes jointures, c'est difficile. C'est pour cela que c'est demandé dans les règles du forum.
    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
    SELECT  
           produits.id_produit, 
           decode(magasin_id, 1, fr.description), 
                                 3, fr.description,
                                 5, fr.description
            ) AS description_francaise,
          es.description AS description_espagnole
    FROM 
           produits,
           magasins,
           langues as fr,
           langues as es
    WHERE 
    	fr.langue_id=1
    	and es.langue_id=3
    	and --La jointure qui va bien sur fr et es
           -- les bonnes jointures
    GROUP BY 
           -- ce qu'il faut
    ORDER BY 
           id_produit;
    PS : J'ai supprimé le Distinct car je ne sais pas pourquoi tu l'as mis, et en général quand on est obligé de mettre un distinct sans savoir pourquoi c'est qu'il y a un problème dans les jointures.
    A+
    Soazig

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Points : 84
    Points
    84
    Par défaut
    Merci soazig,

    En effet, le disctinct ne sert pas, j'ai oublié de l'enlever apres la reprise d'une ancienne requete.
    Je vais tester ta proposition et je te tiens au courant.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Points : 84
    Points
    84
    Par défaut
    Me revoilà,


    Citation Envoyé par soazig
    S'il fait ce que je comprend il te renvoie decode(langue_id, 1, description) si ton magasin_id est 1,3,5.
    Est-ce ce que tu veux?
    Oui c'est ça !


    En fait mon modèle est un peu + complexe, j'avais simplifié pensant que ca serait + facile pour la compréhension mais finalement j'ai eu tord.


    La description est dans la table magasins, qui est elle meme liée à une table "magasin_langues" (car un magasin peut parler plusieurs langues)..

    Je joins la structure de mes tables :



    J'ai tenté une adaptation de ta proposition, mais sans succès, je ne sais pas trop comment m'y prendre....

    D'avance merci !

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Il manque encore un peu pour que ton modèle colle à tes besoins.

    Il te faut

    - une table de langue (ID_LANGUE, INTITULE_LANGUE)
    - une table des messages (ID_MESSAGE, INTITULE_MESSAGE)
    - une table de liaison qui donne le libellé du message dans la langue (ID_MESSASE, ID_LANGUE, LIBELLE_MESSAGE)

    Tu vois le principe, à toi d'adapter pour que ça te convienne totalement.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Points : 84
    Points
    84
    Par défaut
    Merci vmolines, malheureusement je ne peux pas modifier le modèle ..

    J'avais penser créer une vue pour apres faire un "select distinct" dessus (est-ce une bonne idee ?) mais le code suivant ne semble pas lui plaire :

    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
     
    CREATE OR REPLACE 
        VIEW VW_TEST_TRAD(ID_PRODUIT,DESCRIPTION_FRANCAISE,DESCRIPTION_ESPAGNOLE) 
    AS 
    ( 
    SELECT DISTINCT 
           produits.id_produit, 
           decode(magasin_id, 1, decode(langue_id, 1, description), 
                                 3, decode(langue_id, 1, description),
                                 5, decode(langue_id, 1, description)
            ) AS description_francaise,
           decode(langue_id, 3, description) AS description_espagnole
    FROM 
           produits,
           magasins,
           langues
    WHERE 
           -- les bonnes jointures
    GROUP BY 
           -- ce qu'il faut
    ORDER BY 
           id_produit
    );
    Message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [Error Code: 907, SQL State: 42000]  ORA-00907: missing right parenthesis
    ... 1 statement(s) executed, 0 row(s) affected, exec/fetch time: 0.000/0.000 sec [0 successful, 0 warnings, 1 errors]
    Merci

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Points : 84
    Points
    84
    Par défaut
    Oki, pour la vue j'ai trouvé, pas d'order by

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Points : 84
    Points
    84
    Par défaut
    Bonjour

    Me revoilà, je n'ai toujours pas réussi à obtenir ma ligne unique :-(
    Qqun peut-il m'aider ?...

    Merci !

  9. #9
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Tu dois faire changer ce modèle. Il n'est pas adapté à la gestion multi langue.

Discussions similaires

  1. Oracle groupes et fichiers redo
    Par wafiwafi dans le forum Oracle
    Réponses: 2
    Dernier message: 20/12/2011, 13h57
  2. [ORACLE 9i] - Jointure ouverte sur decode
    Par sygale dans le forum Oracle
    Réponses: 3
    Dernier message: 21/04/2005, 17h07
  3. l'équivalent de DECODE de Oracle ?
    Par MokhTelnet dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 25/06/2004, 12h19
  4. Réponses: 9
    Dernier message: 17/01/2004, 11h51

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