Précédent   Forum du club des développeurs et IT Pro > Bases de données > PostgreSQL > Requêtes
Requêtes Forum d'entraide sur les requêtes SQL spécifiques à PostgreSQL, les triggers, les vues, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 28/11/2012, 17h00   #1
LaPanic
Membre habitué
 
Inscription : mai 2007
Messages : 326
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 326
Points : 107
Points : 107
Par défaut [9.1] Transformer les colonnes en lignes

Bonjour tout le monde,
je cherche à changer les colonnes d'une table en lignes.
Voici un exemple simplifié de la table :

Code :
1
2
3
4
5
6
7
8
 
---------------------------
ID | Jan | Feb | Mar | Apr|
---------------------------
ID1| 120 | 300 |  20 |    |
ID2| 130 |     |  15 |    |
ID3| 201 |     |     | 700|
ID4| 504 | 568 |   2 |  45|
ci dessous le resultat souhaité
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
ID | dat | mnt |
----------------
ID1| Jan | 120 |
ID2| Jan | 130 |
ID3| Jan | 201 |
ID4| Jan | 504 |
ID1| Feb | 300 |
ID4| Feb | 568 |
ID1| Mar |  20 |
ID2| Mar |  15 |
ID4| Mar |   2 |
ID3| Apr | 700 |
ID4| Apr |  45 |
J'ai essayé d'appliquer crosstab mais en vain !!
Merci pour votre aide
LaPanic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2012, 17h09   #2
estofilo
Modérateur
 
Inscription : octobre 2008
Messages : 1 702
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 702
Points : 2 347
Points : 2 347
La plupart des langages de programmation permettent de faire ça en retraitant le résultat d'un SELECT * dans le code client.
Mais en SQL à proprement parler ce n'est pas possible.
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2012, 17h25   #3
al1_24
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 868
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 52
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 868
Points : 11 734
Points : 11 734
Avec une simple requête union ?
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SELECT  id
    ,   jan     AS  mnt
    ,   'Jan'   AS  dat
FROM    matable
WHERE   jan IS NOT NULL
UNION
SELECT  id
    ,   feb     AS  mnt
    ,   'Feb'   AS  dat
FROM    matable
WHERE   feb IS NOT NULL
UNION
SELECT  id
    ,   mar     AS  mnt
    ,   'Mar'   AS  dat
FROM    matable
WHERE   mar IS NOT NULL
UNION
SELECT  id
    ,   apr     AS  mnt
    ,   'Apr'   AS  dat
FROM    matable
WHERE   apr IS NOT NULL
__________________
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 10
Vieux 29/11/2012, 19h10   #4
Waldar
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 6 276
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 35
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : septembre 2008
Messages : 6 276
Points : 13 568
Points : 13 568
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
UNION ALL !
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2012, 14h54   #5
LaPanic
Membre habitué
 
Inscription : mai 2007
Messages : 326
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 326
Points : 107
Points : 107
Merci tout le monde,
Finalement, j'ai opté pour une requête union. Pour cet exemple, il y a 12 mois, soit 12 colonnes, mais je ne sais pas si c'est correct au niveau de l'optimisation. Après, si on a plus de colonnes à inverser, je ne sais pas si ça serait la bonne solution !!!!?
LaPanic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2012, 13h08   #6
punkoff
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 2 154
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 2 154
Points : 3 486
Points : 3 486
Bonjour,

La bonne solution serait de normaliser votre table afin de ne pas avoir ce genre de choses à faire, par exemple :

T_MOIS(MOI_ID, MOI_DESC)
T_VALEUR(#FK_1, #MOI_ID, valeur)
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2012, 15h42   #7
LaPanic
Membre habitué
 
Inscription : mai 2007
Messages : 326
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 326
Points : 107
Points : 107
Merci punkoff,
En fait, moi j'essaye de m'adapter aux formats des inputs que je reçois pour éviter au maximum les traitements
LaPanic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2012, 11h27   #8
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 4 059
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 37
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 4 059
Points : 8 915
Points : 8 915
Vu que le format des données est loin d'être optimal, difficile de parler d'optimisation de la requête après ça...
Pour optimiser, il faudrait, comme le dit Punkoff, revoir le modèle de données.
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 10h06.


 
 
 
 
Partenaires

Hébergement Web