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

SQL Oracle Discussion :

Fonction PIVOT (transpose)


Sujet :

SQL Oracle

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 13
    Par défaut Fonction PIVOT (transpose)
    Bonsoir à tous,

    J'aimerai effectuer un transpose, j'ai trouvé la fonction pivot mais apparement cette fonction s'associe forcément avec un COUNT ou un Max.

    CI-dessous ma table initiale :

    NUM ADR DIR
    1 PAL 34
    1 PEL 43
    1 PUL 54
    2 PAL 34
    2 POU 47
    2 TRU 23

    Le principe est d'avoir :

    NUM ADR_1 DIR_1 ADR_2 DIR_2 ADR_3 DIR_3
    1 PAL 34 PEL 43 PUL 54
    2 PAL 34 POU 47 TROU 23.

    Ou existe-t-il une autre fonction.

    Merci d'avance pour votre aide.

    Cordialement

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 412
    Par défaut
    Ou un SUM

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    TMP@MINILHC >with tmp as (
      2   select 1 as num, 'PAL' as adr, 34 as dir from dual union
      3   select 1, 'PEL', 43 from dual union
      4   select 1, 'PUL', 54 from dual union
      5   select 2, 'PAL', 34 from dual union
      6   select 2, 'POU', 47 from dual union
      7   select 2, 'TRU', 23 from dual )
      8   select num ,PAL,PEL,PUL,POU,TRU from tmp pivot (sum(dir) for adr in ('PAL' as PAL,'PEL' as PEL,'PUL' as PUL,'POU' as POU,'TRU' as TRU));
     
           NUM        PAL        PEL        PUL        POU        TRU
    ---------- ---------- ---------- ---------- ---------- ----------
             1         34         43         54
             2         34                               47         23
    Pour pivot, si vous ne voulez pas mettre les colonees en dur, c'est pivot XML.


    Sinon, vu votre description peut-etre listagg. Mais du coup ca renvoie juste une ligne de varchar2.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    TMP@MINILHC >with tmp as (
      2   select 1 as num, 'PAL' as adr, 34 as dir from dual union
      3   select 1, 'PEL', 43 from dual union
      4   select 1, 'PUL', 54 from dual union
      5   select 2, 'PAL', 34 from dual union
      6   select 2, 'POU', 47 from dual union
      7   select 2, 'TRU', 23 from dual )
      8   select num ,listagg(adr||' '||dir,' ') within group (order by adr) as col1 from tmp group by num;
     
           NUM COL1
    ---------- ----------------------------------------
             1 PAL 34 PEL 43 PUL 54
             2 PAL 34 POU 47 TRU 23

  3. #3
    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
    Ou sinon on peut l'écrire à l'ancienne :
    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
    24
    25
    26
    27
    28
    29
    WITH tmp AS
    (
    SELECT 1 AS num, 'PAL' AS adr, 34 AS dir FROM dual union all
    SELECT 1       , 'PEL'       , 43        FROM dual union all
    SELECT 1       , 'PUL'       , 54        FROM dual union all
    SELECT 2       , 'PAL'       , 34        FROM dual union all
    SELECT 2       , 'POU'       , 47        FROM dual union all
    SELECT 2       , 'TRU'       , 23        FROM dual
    )
      ,  sr as
    (
    select num, adr, dir
         , row_number() over(partition by num order by adr asc) as rn
      from tmp
    )
      select num
           , max(case rn when 1 then adr end) as adr_1
           , max(case rn when 1 then dir end) as dir_1
           , max(case rn when 2 then adr end) as adr_2
           , max(case rn when 2 then dir end) as dir_2
           , max(case rn when 3 then adr end) as adr_3
           , max(case rn when 3 then dir end) as dir_3
        from sr
    group by num;
     
    NUM ADR_1 DIR_1 ADR_2 DIR_2 ADR_3 DIR_3
    --- ----- ----- ----- ----- ----- -----
      1 PAL      34 PEL      43 PUL      54 
      2 PAL      34 POU      47 TRU      23

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 13
    Par défaut
    Merci Beaucoup pour vos réponses..

    J'ai décidé d'utiliser la méthode à l'ancienne et cela fonctionne parfaitement!!

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

Discussions similaires

  1. Fonction PIVOT ou pas ?
    Par thomj dans le forum Langage SQL
    Réponses: 13
    Dernier message: 13/01/2014, 18h04
  2. Creer une requete SQL avec la fonction PIVOT
    Par SALIA LOUA OLIVIER dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/10/2013, 15h35
  3. Fonction pivot mensuel / hebdomadaire automatique
    Par clickandgo dans le forum VBA Access
    Réponses: 6
    Dernier message: 31/05/2013, 23h12
  4. [XL-2003] probleme avec la fonction Application.Transpose()
    Par piewot dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 13/10/2011, 13h40
  5. Réponses: 5
    Dernier message: 13/12/2005, 22h10

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