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 23/08/2011, 06h22   #1
Invité de passage
 
Inscription : mai 2006
Messages : 66
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 66
Points : 3
Points : 3
Par défaut Afficher les colonnes en lignes

Bonjour,

J'ai pas mal cherché sur les forums mais ne suis pas arrivé à résoudre mon problème.

J'ai une table comme celle-ci :

Code :
1
2
3
4
5
6
7
8
9
 
CLIENT    EMPLOYEUR
C1                TOTO        
C1                ZAZA 
C2                PRIVE
C1               AZERTY
C2               LECINE
C3                  ....
...                   ....
Je souhaite obtenir en résultat les X derniers employeurs en ligne, par exemple

Code :
1
2
3
4
5
 
CLIENT    EMPLOYEUR1    EMPLOYEUR2     EMPLOYEUR3
C1                TOTO                   ZAZA                 AZERTY
C2                 PRIVE                 LECINE
C3                 ...
Le nom de l'employeur étant variable, je ne peux pas utiliser le case. Savez-vous comment faire ?

Merci,
villegente est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 10h10   #2
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 445
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 445
Points : 7 532
Points : 7 532
Il s'agit là d'un PIVOT, opération qui n'est pas prévue dans le langage SQL standard et non prise en charge par Oracle.
Comme il n'est pas possible de connaître à l'avance le nombre de colonnes, il est plus correct de demander à l'application de prendre en charge cette mise en forme du résultat de la requête.
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 11h41   #3
Invité de passage
 
Inscription : mai 2006
Messages : 66
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 66
Points : 3
Points : 3
Je suis désolé, je n'ai pas été suffisamment précis dans l’énoncé du problème. Il est possible de connaître le nombre de colonnes car je souhaite prendre les X derniers employeurs.

A terme cette requête sera exécutée sur un serveur 11G, mais pour le moment elle doit tourner sur une 10G. Je ne suis pas contre un PL/SQL mais je ne le maîtrise pas encore suffisamment.
villegente est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 12h00   #4
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 445
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 445
Points : 7 532
Points : 7 532
En connaissant le nombre maximal, on peut faire quelque chose.
En supposant qu'on a une colonne ORDRE qui précise l'ordre antéchronologique de l'employeur :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT  tb1.client
    ,   MAX(tb1.employeur)  AS employeur1
    ,   MAX(tb2.employeur)  AS employeur2
    ,   MAX(tb3.employeur)  AS employeur3
FROM    matable tb1
    LEFT JOIN
        matable tb2
        ON  tb2.client = tb1.client
        AND tb2.ordre  = 2
    LEFT JOIN
        matable tb3
        ON  tb3.client = tb1.client
        AND tb3.ordre  = 3
WHERE   tb1.ordre  = 1
GROUP BY tb1.client
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 15h03   #5
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Si ce qui vous importe est d'avoir vos résultats par ligne, sans que les colonnes aient de l'importance, vous pouvez essayer ce genre de chose


Code :
1
2
3
4
5
6
7
8
9
10
11
SELECT client,
       LTRIM(MAX(SYS_CONNECT_BY_PATH(employeur,','))
       KEEP (DENSE_RANK LAST ORDER BY Courant),',') AS ListeEmployeur
FROM   (SELECT client,
               employeur,
               ROW_NUMBER() OVER (PARTITION BY client ORDER BY employeur) AS Courant,
               ROW_NUMBER() OVER (PARTITION BY client ORDER BY employeur) -1 AS Precedent
        FROM   MaTable)
GROUP BY client
CONNECT BY Precedent = PRIOR Courant AND client= PRIOR client
START WITH Courant = 1;
mais ca ne répond pas exactement a votre demande initiale
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh 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 09h54.


 
 
 
 
Partenaires

Hébergement Web