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

Oracle Discussion :

CASE statement retourne plusieurs lignes [10g]


Sujet :

Oracle

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Octobre 2012
    Messages : 33
    Points : 29
    Points
    29
    Par défaut CASE statement retourne plusieurs lignes
    Bonjour,

    J'ai un souci et j'aimerai l'aide précieuse de la communauté

    Voilà, j'ai une query du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT tag, description FROM tt WHERE al = 123
    qui me donne ces 3 lignes :
    -tag- -desription-
    A ---- Pomme
    B ---- Poire
    C ---- Pêche

    Cependant, ce qui m'intéresse c'est que, en fonction de la description la query me retourne 1, 2 ou 3 lignes :
    quand la description est Pomme, la query me retourne 3 lignes,
    quand c'est Poire alors 1 ligne, et
    quand c'est Pêche alors 2 lignes.
    Mais est-ce seulement possible ?

    Voici ce qui m'arrangerait d'obtenir :
    -tag- -desription-
    A ---- Pomme
    A ---- Pomme
    A ---- Pomme
    B ---- Poire
    C ---- Pêche
    C ---- Pêche

    J'ai essayé en utilisant CASE et des subquery mais je ne parviens pas à obtenir les résultats convenablement.

    Si vous avez des pistes, merci pour vos conseils les gars

    Henri

  2. #2
    Membre éclairé Avatar de plabrevo
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 547
    Points : 670
    Points
    670
    Par défaut
    Selon le modele de donnees, une solution est de creer et d'utiliser une vue et de l'utiliser a la place de la table tt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE VIEW tt_v AS
    SELECT * FROM tt_table
    WHERE description IN ('Pomme','Peche','Poire')
    UNION ALL
    SELECT * FROM tt_table
    WHERE description IN ('Pomme','Peche')
    UNION ALL
    SELECT * FROM tt_table
    WHERE description IN ('Pomme')
    ;

  3. #3
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Peut être avec une pseudo table de paramétrage, 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
    28
    29
    30
    31
    32
    33
    SQL>   with result as (
      2  select 123 as al, 'A' as tag, 'Pomme' as description from dual union all
      3  select 123 as al, 'B' as tag, 'Poire' as description from dual union all
      4  select 123 as al, 'C' as tag, 'Peche' as description from dual
      5  ),
      6         param_nb_ligne as (
      7  select 3 as nb, 'Pomme' as description from dual union all
      8  select 1 as nb, 'Poire' as description from dual union all
      9  select 2 as nb, 'Peche' as description from dual
     10  ),
     11         gen_ligne as (
     12  select level as lvl
     13    from dual
     14  connect by level <= (select max(nb) from param_nb_ligne)
     15  )
     16  select r.tag, r.description
     17    from result r
     18    join param_nb_ligne p on p.description = r.description
     19    join gen_ligne g on g.lvl <= p.nb
     20  /
     
    T DESCR
    - -----
    A Pomme
    A Pomme
    A Pomme
    B Poire
    C Peche
    C Peche
     
    6 rows selected.
     
    SQL>

  4. #4
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Utilisez une table pivot pour multiplier les enregistrements de la table tt via un produit cartésien et gardez dans el résultat le nombre des lignes désirée pour chaque description.
    Autre idée utilisez une fonction pipelined pour multiplier les enregistrements comme bon vous semble.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Octobre 2012
    Messages : 33
    Points : 29
    Points
    29
    Par défaut
    Waouw! Super, 3 réponses rapides

    J'ai bien relevé vos propositions, je vais travailler sur ces pistes là grâce à vous. Merci les gars

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/08/2009, 21h14
  2. Réponses: 3
    Dernier message: 28/07/2009, 16h01
  3. Réponses: 13
    Dernier message: 13/08/2007, 14h29
  4. Procédure stockée - Retourner plusieurs ligne d'une table
    Par ronando dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 02/11/2005, 13h19
  5. Réponses: 14
    Dernier message: 09/04/2004, 13h44

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