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

  1. #1
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    335
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 335
    Points : 148
    Points
    148
    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 émérite
    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
    Points : 2 890
    Points
    2 890
    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 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 080
    Points : 30 778
    Points
    30 778
    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
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 814
    Points
    17 814
    Par défaut
    UNION ALL !

  5. #5
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    335
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 335
    Points : 148
    Points
    148
    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 : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    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)

  7. #7
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    335
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 335
    Points : 148
    Points
    148
    Par défaut
    Merci punkoff,
    En fait, moi j'essaye de m'adapter aux formats des inputs que je reçois pour éviter au maximum les traitements

  8. #8
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 007
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 007
    Points : 23 681
    Points
    23 681
    Par défaut
    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 et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

Discussions similaires

  1. [2008R2] Transformer toutes les colonnes en lignes
    Par Espoirwakal dans le forum Développement
    Réponses: 13
    Dernier message: 10/01/2014, 00h33
  2. Réponses: 6
    Dernier message: 11/10/2009, 11h57
  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, 10h16
  4. Transformer des colonnes en lignes
    Par marman dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 23/11/2006, 18h43
  5. transformer des colonnes en lignes
    Par flonardi dans le forum Oracle
    Réponses: 13
    Dernier message: 28/10/2004, 13h43

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