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 :

Résultat d'une requête sur plusieurs colonnes [FAQ]


Sujet :

Oracle

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 32
    Points : 31
    Points
    31
    Par défaut Résultat d'une requête sur plusieurs colonnes
    Bonjour,
    Voici ma problématique :

    Soit une table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    Marque  Modèle
    Renault  Clio
    Renault  Twingo
    Renault  5
    Peugeot 106
    Peugeot 205
    Peugeot 607
    Je voudrais sélectionner les modèles par marque comme suit (une sorte de transposition), sachant que j'ai toujours 3 modèles différents par marque :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    Marque  Modèle1 Modèle2 Modèle3
    Renault Twingo   Clio       5
    Peugeot 106       205       607
    Merci d'avance

  2. #2
    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
    select marque,max("1"),max("2"),max("3") 
    from (
      select 
        marque,
        row_number() over (partition by marque order by 1) r, 
        modele 
      from t)
    pivot ((modele) for r in (1,2,3)) 
    group by marque;
    afin d'éviter des réponses qui ne te servent pas, précise ta version selon les règles de ce forum
    [Règles et infos] A LIRE AVANT DE POSTER

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 32
    Points : 31
    Points
    31
    Par défaut
    Merci pour ta réponse

    afin d'éviter des réponses qui ne te servent pas, précise ta version selon les règles de ce forum
    Je précise que je travaille sur une base oracle en 10g. Cette solution est elle valable?

  4. #4
    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
    non, PIVOT c'est du 11g
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    create table t as (
    select 'Renault' marque, 'Clio' model from dual union all
    select 'Renault', 'Twingo' from dual union all
    select 'Renault', '5' from dual union all
    select 'Peugeot','106' from dual union all
    select 'Peugeot','205' from dual union all
    select 'Peugeot','607' from dual );
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select 
      marque, 
      max(decode(r,1,model)) model1,
      max(decode(r,2,model)) model2,
      max(decode(r,3,model)) model3
    from ( 
      select 
        marque, 
        model, 
        row_number() over (partition by marque order by model) r 
      from t)
    group by marque;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MARQUE  MODEL1 MODEL2 MODEL3
    ------- ------ ------ ------
    Peugeot 106    205    607   
    Renault 5      Clio   Twingo

  5. #5
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Laurent, ne serait-ce pas possible que tu nous proposes une entrée dans la FAQ pour cette question qui revient régulièrement ?

    ce serait vraiment sympa, de nous proposer des solutions en fonction des versions

  6. #6
    Membre actif Avatar de hugobob
    Profil pro
    FOI
    Inscrit en
    Septembre 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : Gabon

    Informations professionnelles :
    Activité : FOI

    Informations forums :
    Inscription : Septembre 2005
    Messages : 169
    Points : 203
    Points
    203
    Par défaut
    Joli ! C'est déja interessant !
    Sauf que ce n'est pas automatique!
    Je veux dire qu'avec cette reponse,il faut faire un SELECT sur tout les elements (marques et models dans le cas present)!

    Y a t il une autre solution ?

  7. #7
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par hugobob Voir le message
    Sauf que ce n'est pas automatique!
    Je veux dire qu'avec cette reponse,il faut faire un SELECT sur tout les elements (marques et models dans le cas present)!
    J'avoue ne pas comprendre ce que tu dis !
    Qu'est ce qui n'est pas automatique ?

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 32
    Points : 31
    Points
    31
    Par défaut
    non, PIVOT c'est du 11g

    Code :
    CREATE TABLE t AS (
    SELECT 'Renault' marque, 'Clio' model FROM dual union ALL
    SELECT 'Renault', 'Twingo' FROM dual union ALL
    SELECT 'Renault', '5' FROM dual union ALL
    SELECT 'Peugeot','106' FROM dual union ALL
    SELECT 'Peugeot','205' FROM dual union ALL
    SELECT 'Peugeot','607' FROM dual );Code :
    SELECT
    marque,
    max(decode(r,1,model)) model1,
    max(decode(r,2,model)) model2,
    max(decode(r,3,model)) model3
    FROM (
    SELECT
    marque,
    model,
    row_number() over (partition BY marque ORDER BY model) r
    FROM t)
    GROUP BY marque;
    Code :
    MARQUE MODEL1 MODEL2 MODEL3
    ------- ------ ------ ------
    Peugeot 106 205 607
    Renault 5 Clio Twingo


    Beau travail
    merci

  9. #9
    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
    Citation Envoyé par hugobob
    Joli ! C'est déja interessant !
    Sauf que ce n'est pas automatique!
    Je veux dire qu'avec cette reponse,il faut faire un SELECT sur tout les elements (marques et models dans le cas present)!

    Y a t il une autre solution ?
    le nombre de colonne (model1, model2, model3) n'est pas dynamique, mais ça c'est normal...

    quel est ton but? peux-tu employer PL/SQL et dbms_output par exemple?

  10. #10
    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
    Citation Envoyé par manucha Voir le message
    Beau travail
    merci
    Content que ça te plaise

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 27/03/2013, 15h29
  2. mettre les résultat d'une requête sur plusieurs colonne
    Par irma2011 dans le forum Requêtes
    Réponses: 4
    Dernier message: 11/01/2012, 11h09
  3. Réponses: 4
    Dernier message: 29/08/2008, 14h21
  4. [MySQL] Affichage des résultats d'une requête sur plusieurs pages
    Par leloup84 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 25/10/2006, 13h24
  5. [SQL] Afficher les résultats d'une requête sur plusieurs pages
    Par mealtone dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 07/09/2006, 13h20

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