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

MS SQL Server Discussion :

Pivot sur colonnes multiples


Sujet :

MS SQL Server

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 36
    Points : 31
    Points
    31
    Par défaut Pivot sur colonnes multiples
    Bonjour à tous

    J'ai du mal à mettre au point une requête SQL, ma problématique est la suivante :

    Je dispose de données sous la forme
    GROUPE -- MOIS/ANNEE -- ATTRIBUT1 -- ATTRIBUT2
    1 ................Janvier09...........A.................B
    1 ................Février09...........C ................D
    2 ................Janvier09...........E ................F

    Je souhaite afficher ces mêmes données sous la forme
    GROUPE--Janvier09--Février09
    1................A................C
    1................B................D
    2................E..............NULL
    2................F..............NULL

    Mais voilà, à écrire comme ça en SQL, je vois pas vraiment comment attaquer la chose, j'ai bien pensé à un PIVOT sur le MOIS/ANNEE mais je n'y arrive qu'avec 1 seule colonne attribut... Des idées ?

    Merci d'avance

  2. #2
    Nouveau membre du Club
    Inscrit en
    Février 2009
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 33
    Points : 38
    Points
    38
    Par défaut
    Bonjour,

    Avez-vous essayer case.. when....

    pAr exemple je ferais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select GROUPE, 
         case when MOIS/ANNEE = 'Janvier09' then ATTRIBUT else Null As Janvier09,
         case when MOIS/ANNEE = 'Fevrier09' then ATTRIBUT else Null As Fevrierr09,
         ....
         END
    from ta_table
    en mixant un peu. C'est long mais ça à le mérite de marcher chez moi.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 36
    Points : 31
    Points
    31
    Par défaut
    Merci de ta réponse,

    j'ai pensé aussi à cette solution, mais je ne vois pas comment faire pour que ma ligne ATTRIBUT1 soit suivie de la ligne ATTRIBUT2... d'autant qu'ici je n'ai présenté qu'un jeu d'essai, je dois avoir une bonne quarantaine d'attributs...

  4. #4
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    Bonjour lamorkytu,

    Je ne suis pas un spécialiste de SQL Server, en particulier, mais il me semble que l'idée directrice soit la suivante :

    Ton problème vient, si j'ai bien compris, du fait que tous tes champs ATTRIBUTn doivent se retrouver, en final, pour ton besoin, au même niveau. Il faut donc arriver à produire, en final, une table T1 comportant les champs suivants :
    - Groupe
    - MoisAnnee
    - Attribut
    Ensuite, effectivement, la requête PIVOT est nécessaire.

    Pour arriver à ce résultat, la solution serait de créer autant de requêtes, que de champ ATTRIBUT, soit (avec INSERT INTO à la place du SELECT) :
    1 - SELECT Groupe, MoisAnnee, Attribut1 from TaTable => dans la table T1
    2 - SELECT Groupe, MoisAnnee, Attribut2 from TaTable => dans la table T1
    ...
    n - SELECT Groupe, MoisAnnee, Attributn from TaTable => dans la table T1

    La table T1 pourra donc être analysée par une requête "analyse croisée", dirait-on dans Access (PIVOT).

    Bon courage,
    Richard.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 36
    Points : 31
    Points
    31
    Par défaut
    Voici les nouvelles

    Concernant le CASE, le fait qu'il ne puisse pas renvoyer un ensemble de tuples est particulièrement bloquant, si j'avais eu un seul attribut ça aurait été parfait mais là ce n'est pas le cas.

    Concernant ta solution Richard_35, il y a un léger accroc
    En effet, passer par un table temporaire GROUPE -- MOIS/ANNEE -- ATTRIBUT m'a semblé très bonne au départ (même si cela m'oblige à passer par une table temporaire), le souci est au niveau du PIVOT car l'opération m'oblige à utiliser une fonction d'agrégation et donc à mélanger tous les attributs en un seul.

    Du coup, j'ai mixé les deux solutions, à savoir la table temporaire et des CASE pour la requête mais là encore un problème apparaît à savoir que le case renvoie FORCEMENT une valeur et qu'ainsi pour chaque colonne (MOIS/ANNEE) j'ai 12 lignes d'attributs et non pas 1.

    Plus précisément :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    case when MOIS/ANNEE = 'Janvier09' then ATTRIBUT AS Janvier09
    Va renvoyer la valeur ATTRIBUT lorsque rencontrée, mais NULL sinon; en d'autres termes, préciser le MOIS/ANNEE ne vas pas 'bloquer' mon case à cette valeur mais seulement évaluer quel résultat renvoyer...

    Par exemple :
    GROUPE -- Janvier09
    1...................A
    1...............NULL
    1...............NULL
    1...............NULL
    1...............NULL
    1...............NULL
    1...............NULL
    1...............NULL
    1...............NULL

    Si je ne pouvais pas avoir de valeurs nulles un simple filtre aurait fait l'affaire, mais bien sûr ce n'est pas le cas, certains attributs peuvent être à NULL...
    D'autres pistes ?

  6. #6
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 36
    Points : 31
    Points
    31
    Par défaut
    Je pense avoir (ENFIN) trouvé la solution !

    Je prenais la chose à l'envers en me fixant sur l'idée de pivoter mes MOIS/ANNEE.

    Ma solution est d'abord d'utiliser UNPIVOT de façon à ce que mes attributs soient regroupés en deux colonnes ATTRIBUTS et VALEUR (un grand merci à cette page web grandiose : http://www.yafla.com/dennisforbes/UN...rver-2005.html.

    Une fois cela fait, j'ai mes données sous la forme :
    GROUPE -- MOIS/ANNEE -- ATTRIBUT -- VALEUR

    Et du coup, hop, un PIVOT pour mettre l'ensemble de mes MOIS/ANNEE en tant que colonnes et j'arrive à un résultat de la forme :
    GROUPE -- PROPRIETE -- JAN09 -- FEV09
    1..................ATT1.........A...........C
    1..................ATT2.........B...........D
    (etc)

    J'ai juste un petit problème d'ordre mais manipuler des ORDER BY est bien moins prise de tête

    Merci à vous deux pour m'avoir guidé vers la solution

    [EDIT] J'oubliais, au cas où d'autres gens viendraient à rencontrer mon souci, UNPIVOT exclut les valeurs nulles par défaut ce qui est gênant quand les données peuvent être nulles comme dans mon cas. Du coup il faut feinter légèrement (voir http://www.eggheadcafe.com/software/...-and-null.aspx, où l'on décrit comment prendre en compte les valeurs nulles lors d'un UNPIVOT grâce à COALESCE et NULLIF).

  7. #7
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    Eh oui, bravo !

    Il suffisait juste d'ajouter la valeur "ATTRIBUT1" en ajout d'enregistrments du champ ATTRIBUT1, la valeur "ATTRIBUT2" en ajout d'enregistrments du champ ATTRIBUT2, etc...

    Ensuite, la requête analyse croisée roule toute seule...

    N'oublies pas la mention "Résolu".
    Richard.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. ClientDataSet recherche sur de multiple colonnes
    Par joc02 dans le forum Bases de données
    Réponses: 1
    Dernier message: 10/03/2015, 18h34
  2. [XL-2010] Etendre une formule sur lignes et colonnes multiples
    Par Wishguu dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 10/02/2014, 18h28
  3. Requête pivot sur deux colonnes
    Par Caillou63 dans le forum Développement
    Réponses: 5
    Dernier message: 16/05/2012, 19h49
  4. test sur colonne avec tableau à dimensions multiple
    Par oscar.cesar dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 22/07/2009, 14h52
  5. copier/coller de formules sur colonnes multiples
    Par Frayer dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 22/07/2009, 11h45

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