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

Requêtes PostgreSQL Discussion :

[9.1] Transformer les colonnes en lignes


Sujet :

Requêtes PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Mai 2007
    Messages
    335
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 335
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    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.

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 134
    Par défaut
    Avec une simple requête union ?
    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
    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
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    UNION ALL !

  5. #5
    Membre éclairé
    Inscrit en
    Mai 2007
    Messages
    335
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 335
    Par défaut
    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 !!!!?

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    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)

Discussions similaires

  1. [2008R2] Transformer toutes les colonnes en lignes
    Par Espoirwakal dans le forum Développement
    Réponses: 13
    Dernier message: 09/01/2014, 23h33
  2. Réponses: 6
    Dernier message: 11/10/2009, 10h57
  3. Requête SQL : Afficher les colonnes en ligne, et vice versa
    Par paflolo dans le forum Langage SQL
    Réponses: 7
    Dernier message: 17/03/2009, 09h16
  4. Transformer des colonnes en lignes
    Par marman dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 23/11/2006, 17h43
  5. transformer des colonnes en lignes
    Par flonardi dans le forum Oracle
    Réponses: 13
    Dernier message: 28/10/2004, 12h43

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