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 :

Tableau dynamique croisé


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 10
    Points : 18
    Points
    18
    Par défaut Tableau dynamique croisé
    Bonjour a tous, j'ai besoin de vous afin de réaliser une requête
    je vous expose mon problème :

    J'ai deux tables
    "table_voiture" contenant les champs :
    "marque", "couleur", "moteur", "poids"
    et une autre table "table_perf_voirture" contenant les champs :
    "marque", "couleur", "moteur", "poids", "cylindre", "tours", "temps_tours"

    Dans ma table "table_voiture" je dispose des informations suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Marque       Couleur      Moteur      Poids     
    ---------------------------------------------
    Ferrari       Rouge       V6           1,5T    
    Ferrari       Jaune       V8           1,6T
    Et dans ma table "table_pref_voiture"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Marque    Couleur   Moteur    Poids   Cylindre     tours     temps_tours
     -----------------------------------------------------------------------
    Ferrari      Rouge    V6          1,5T     2300      LAP1     1'12'768
    Ferrari      Rouge    V6          1,5T     2300      LAP2     1'17'478
    Ferrari      Jaune    V8          1,6T     2800      LAP1     1'10'568
    Ferrari      Jaune    V8          1,6T     2800      LAP2     1'09'988
    j'essaye d'obtenir le résultat suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Marque    Couleur   Moteur    Poids   Cylindre    LAP1        LAP2
    ----------------------------------------------------------------------
    Ferrari      Rouge    V6       1,5T     2300     1'12'768    1'17'478
    Ferrari      Jaune    V8       1,6T     2800     1'10'568    1'09'988
    (j’espère que je suis assez clair), merci de m'indiquer si cela est réalisable car ça fait 3 jours que je suis sur cette requête mais je trouve rien
    je vous remercie pour votre aide.
    (PS : il faut que le nom des colonnes contenant les temps au tour soit les informations contenu dans la table "table_perf_voiture" champ "tour")

  2. #2
    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
    Non ça n'est pas possible en une requête SQL.
    Enfin c'est possible si tu souhaites n'avoir qu'un nombre bien défini de colonnes LAP, par exemple 2 ou 10, mais c'est statique.
    Comme j'imagine que le nombre de LAP varie, il faut faire du PL/SQL.

    Ce lien peut t'aider à mettre en place le code en fonction de ta version d'oracle que tu n'as d'ailleurs pas précisée :
    Pivot Dynamique

    Ci dessous un exemple statique avec ton exemple :
    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
    SQL>   with table_pref_voiture (Marque,Couleur,Moteur,Poids,Cylindre,tours,temps_tours) as (
      2  select 'Ferrari','Rouge','V6','1,5T',2300,'LAP1','1:12:768' from dual union all
      3  select 'Ferrari','Rouge','V6','1,5T',2300,'LAP2','1:17:478' from dual union all
      4  select 'Ferrari','Jaune','V8','1,6T',2800,'LAP1','1:0:568'  from dual union all
      5  select 'Ferrari','Jaune','V8','1,6T',2800,'LAP2','1:09:988' from dual
      6  )
      7  select Marque,Couleur,Moteur,Poids,Cylindre,
      8         max(case when tours = 'LAP1' then temps_tours end) as LAP1,
      9         max(case when tours = 'LAP2' then temps_tours end) as LAP2
     10    from table_pref_voiture
     11   group by Marque,Couleur,Moteur,Poids,Cylindre
     12  /
     
    MARQUE  COULE MO POID   CYLINDRE LAP1     LAP2
    ------- ----- -- ---- ---------- -------- --------
    Ferrari Rouge V6 1,5T       2300 1:12:768 1:17:478
    Ferrari Jaune V8 1,6T       2800 1:0:568  1:09:988
     
    SQL>

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 10
    Points : 18
    Points
    18
    Par défaut
    Oui en effet j'ai oublié de préciser que ma version d'oracle est la 9 (il me semble que le pivot ne fonctionne pas, ou alors je ne sais pas m'en servir)
    quoi qu'il en soit merci pour ta réponse rapide je vais essayer de m'inspirer de ton lien

  4. #4
    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
    La fonction PIVOT est apparue en 11G, mais ma requête fonctionne sur une 9i, mais elle est statique. (PIVOT est également statique puisqu'il faut connaître toutes les colonnes pour parser la requête)

    Il faudra donc s'inspirer de la dernière partie du lien ci-dessus

  5. #5
    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
    Une adaptation à ton exemple du code pour générer une requête dynamique donne :
    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
    34
    35
    36
    37
    SQL> create table table_pref_voiture as
      2   WITH table_pref_voiture (Marque,Couleur,Moteur,Poids,Cylindre,tours,temps_tours) AS (
      3      SELECT 'Ferrari','Rouge','V6','1,5T',2300,'LAP1','1:12:768' FROM dual union ALL
      4      SELECT 'Ferrari','Rouge','V6','1,5T',2300,'LAP2','1:17:478' FROM dual union ALL
      5      SELECT 'Ferrari','Jaune','V8','1,6T',2800,'LAP1','1:10:568' FROM dual union ALL
      6      SELECT 'Ferrari','Jaune','V8','1,6T',2800,'LAP2','1:09:988' FROM dual
      7      )
      8  select * from table_pref_voiture
      9  /
     
    Table created.
     
    SQL> var r refcursor
    SQL> declare
      2    l_query varchar2(4000);
      3  begin
      4    l_query := l_query || 'select Marque,Couleur,Moteur,Poids,Cylindre '||chr(10);
      5    FOR c IN (SELECT DISTINCT tours AS tours FROM table_pref_voiture ORDER BY tours) loop
      6      l_query := l_query || '     , max(case when tours = '''||c.tours||''' then temps_tours end) as "'||c.tours||'" '||chr(10);
      7    end loop;
      8    l_query := l_query || '  from table_pref_voiture '||chr(10);
      9    l_query := l_query || ' group by Marque,Couleur,Moteur,Poids,Cylindre';
     10    --dbms_output.put_line(l_query);
     11    open :r FOR l_query;
     12  end;
     13  /
     
    PL/SQL procedure successfully completed.
     
    SQL> print r
     
    MARQUE  COULE MO POID   CYLINDRE LAP1     LAP2
    ------- ----- -- ---- ---------- -------- --------
    Ferrari Rouge V6 1,5T       2300 1:12:768 1:17:478
    Ferrari Jaune V8 1,6T       2800 1:10:568 1:09:988
     
    SQL>
    A réadapter s'il faut créer une procédure stockée (dans un package évidemment )

Discussions similaires

  1. Réponses: 4
    Dernier message: 03/03/2008, 15h44
  2. Tableau Dynamique croisé sous SQL server
    Par bibi5883 dans le forum Requêtes et SQL.
    Réponses: 0
    Dernier message: 10/01/2008, 17h20
  3. Tableau dynamique croisé
    Par THOMAS33600 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 14/10/2007, 21h58
  4. tableau dynamique croisé
    Par aurelien.tournier dans le forum SQL
    Réponses: 3
    Dernier message: 07/06/2007, 16h19
  5. [VBA-E]Afficher tout dans un tableau dynamique croisé
    Par alex_95 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 01/03/2006, 13h09

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