Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/12/2011, 17h42   #1
Futur Membre du Club
 
Homme Cyril
Développeur .NET
Inscription : novembre 2009
Messages : 9
Détails du profil
Informations personnelles :
Nom : Homme Cyril
Âge : 25
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Développeur .NET

Informations forums :
Inscription : novembre 2009
Messages : 9
Points : 15
Points : 15
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 :
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 :
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 :
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")
sixcoups est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 18h40   #2
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 928
Points : 1 928
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 :
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>
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 29/12/2011, 18h49   #3
Futur Membre du Club
 
Homme Cyril
Développeur .NET
Inscription : novembre 2009
Messages : 9
Détails du profil
Informations personnelles :
Nom : Homme Cyril
Âge : 25
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Développeur .NET

Informations forums :
Inscription : novembre 2009
Messages : 9
Points : 15
Points : 15
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
sixcoups est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 18h53   #4
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 928
Points : 1 928
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
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2011, 01h04   #5
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 928
Points : 1 928
Une adaptation à ton exemple du code pour générer une requête dynamique donne :
Code :
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 )
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h18.


 
 
 
 
Partenaires

Hébergement Web