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

Oracle Discussion :

Pivoter une table


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2006
    Messages : 22
    Par défaut Pivoter une table
    Bonjour

    J'ai actuellement une table de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    EEH_DATE            EEH_QTEPCSE EEH_QTEGCSE EEH_QTEBSE EEH_QTEPCXE EEH_QTEGCXE EEH_QTEBXE EEH_QTECALLE EEH_QTEPALE EEH_QTECSUSP EEH_QTEUSUSP
    07/01/2010          531         688         0          0           34          41         193          118         7            68          
    08/01/2010          114         202         0          0           259         55         349          128         8            45          
    04/01/2010          115         705         0          0           98          83         93           179         45           314         
    05/01/2010          136         799         0          0           36          46         11           114         5            35          
    06/01/2010          14          139         0          0           42          26         85           215         8            48          
    11/01/2010          160         576         1          0           109         9          113          163         3            19          
    12/01/2010          71          659         5          0           160         22         24           238         0
    Mon but, trouver une requête qui pour obtenir un résultat comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    CHAMPS            LIBELLE                                LUNDI                                  MARDI                                  MERCREDI                               JEUDI                                  VENDREDI                               SAMEDI                                
    EEH_QTEPCXE       Nombre de Petit Colis X-Dock Expédiés  0                                      0                                      0                                      0                                      0                                                                            
    EEH_QTECSUSP      Nombre de Colis Suspendus Expédiés     45                                     5                                      8                                      7                                      8                                                                            
    EEH_QTEGCSE       Nombre de Gros Colis Sotckés Expédiés  705                                    799                                    139                                    688                                    202                                                                          
    EEH_QTECALLE      Nombre de Colis Allotis Expédiés       93                                     11                                     85                                     193                                    349                                                                          
    EEH_QTEUSUSP      Nombre UVC Suspendu expédiés           314                                    35                                     48                                     68                                     45                                                                           
    EEH_QTEGCXE       Nombre de Gros Colis X-Dock Expédiés   98                                     36                                     42                                     34                                     259                                                                          
    EEH_QTEPCSE       Nombre de Petit Colis Sotckés Expédiés 115                                    136                                    14                                     531                                    114                                                                          
    EEH_QTEBSE        Nombre de Box Stockés Expédiés         0                                      0                                      0                                      0                                      0                                                                            
    EEH_QTEBXE        Nombre de Box X-Dock Expédiés          83                                     46                                     26                                     41                                     55                                                                           
    FORMULE COLIS EXP Nombre de Colis Expédiés               1094                                   1028                                   306                                    1487                                   979                                                                          
    EEH_QTEPALE       Nombre de Palettes HG Expédiées        179                                    114                                    215                                    118                                    128
    La requête doit déterminer la semaine à prendre en compte pour le résultat à partir d'un simple "sysdate".
    Je suis sous Oracle 10g.

    Je sais que ce sujet a été traité à plusieur reprise mais à aucun moment je n'ai trouvé de solution compatible avec mon problème....

    Si vous avez ne serait-ce qu'une petite piste, je prend car pour le moment j'ai fait cette requete (que je trouve "crade" et qui ne me convient pas du tout)
    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
    30
    31
    32
    33
    34
    35
    36
    37
     
    SELECT LU.CHAMPS, LU.LIBELLE, LUNDI, MARDI, MERCREDI, JEUDI, VENDREDI, SAMEDI FROM 
    --LUNDI 
    (SELECT 'EEH_QTEPCSE' CHAMPS, 'Nombre de Petit Colis Sotckés Expédiés' LIBELLE, EEH_QTEPCSE LUNDI FROM ETAT_EXPED_HG 
    WHERE TO_CHAR(EEH_DATE,'IW YYYY') = TO_CHAR(:LASTDATE,'IW YYYY') AND TO_CHAR(EEH_DATE,'FMDAY') = 'LUNDI'
    UNION
    SELECT 'EEH_QTEGCSE', 'Nombre de Gros Colis Sotckés Expédiés', EEH_QTEGCSE  FROM ETAT_EXPED_HG 
    WHERE TO_CHAR(EEH_DATE,'IW YYYY') = TO_CHAR(:LASTDATE,'IW YYYY') AND TO_CHAR(EEH_DATE,'FMDAY') = 'LUNDI'
    UNION
    SELECT 'EEH_QTEBSE', 'Nombre de Box Stockés Expédiés',  EEH_QTEBSE   FROM ETAT_EXPED_HG 
    WHERE TO_CHAR(EEH_DATE,'IW YYYY') = TO_CHAR(:LASTDATE,'IW YYYY') AND TO_CHAR(EEH_DATE,'FMDAY') = 'LUNDI'
    UNION
    SELECT 'EEH_QTEPCXE', 'Nombre de Petit Colis X-Dock Expédiés', EEH_QTEPCXE  FROM ETAT_EXPED_HG 
    WHERE TO_CHAR(EEH_DATE,'IW YYYY') = TO_CHAR(:LASTDATE,'IW YYYY') AND TO_CHAR(EEH_DATE,'FMDAY') = 'LUNDI'
    UNION
    SELECT 'EEH_QTEGCXE', 'Nombre de Gros Colis X-Dock Expédiés', EEH_QTEGCXE  FROM ETAT_EXPED_HG 
    WHERE TO_CHAR(EEH_DATE,'IW YYYY') = TO_CHAR(:LASTDATE,'IW YYYY') AND TO_CHAR(EEH_DATE,'FMDAY') = 'LUNDI'
    UNION
    SELECT 'EEH_QTEBXE', 'Nombre de Box X-Dock Expédiés',  EEH_QTEBXE   FROM ETAT_EXPED_HG 
    WHERE TO_CHAR(EEH_DATE,'IW YYYY') = TO_CHAR(:LASTDATE,'IW YYYY') AND TO_CHAR(EEH_DATE,'FMDAY') = 'LUNDI'
    UNION
    SELECT 'EEH_QTECALLE', 'Nombre de Colis Allotis Expédiés', EEH_QTECALLE FROM ETAT_EXPED_HG 
    WHERE TO_CHAR(EEH_DATE,'IW YYYY') = TO_CHAR(:LASTDATE,'IW YYYY') AND TO_CHAR(EEH_DATE,'FMDAY') = 'LUNDI'
    UNION
    SELECT 'FORMULE COLIS EXP','Nombre de Colis Expédiés', EEH_QTEPCSE+EEH_QTEGCSE+EEH_QTEBSE+EEH_QTEPCXE+EEH_QTEGCXE+EEH_QTEBXE+EEH_QTECALLE FROM ETAT_EXPED_HG
    WHERE TO_CHAR(EEH_DATE,'IW YYYY') = TO_CHAR(:LASTDATE,'IW YYYY') AND TO_CHAR(EEH_DATE,'FMDAY') = 'LUNDI'
    UNION
    SELECT 'EEH_QTEPALE', 'Nombre de Palettes HG Expédiées',  EEH_QTEPALE FROM ETAT_EXPED_HG 
    WHERE TO_CHAR(EEH_DATE,'IW YYYY') = TO_CHAR(:LASTDATE,'IW YYYY') AND TO_CHAR(EEH_DATE,'FMDAY') = 'LUNDI'
    UNION
    SELECT 'EEH_QTECSUSP', 'Nombre de Colis Suspendus Expédiés', EEH_QTECSUSP FROM ETAT_EXPED_HG 
    WHERE TO_CHAR(EEH_DATE,'IW YYYY') = TO_CHAR(:LASTDATE,'IW YYYY') AND TO_CHAR(EEH_DATE,'FMDAY') = 'LUNDI'
    UNION
    SELECT 'EEH_QTEUSUSP', 'Nombre UVC Suspendu expédiés', EEH_QTEUSUSP FROM ETAT_EXPED_HG
    WHERE TO_CHAR(EEH_DATE,'IW YYYY') = TO_CHAR(:LASTDATE,'IW YYYY') AND TO_CHAR(EEH_DATE,'FMDAY') = 'LUNDI') LU,
    --MARDI
    le meme bloc pour le mardi et ainsi de suite....
    Merci beaucoup

  2. #2
    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
    En Oracle 11g vous avez l'opérateur UNPIVOT, mais pas en 10g.

    Il y a néanmoins un peu plus simple que votre requête (je me suis limité à deux indicateurs) :
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    with MaTable as
    ( 
    select to_date('07/01/2010', 'dd/mm/yyyy') as dt, 531 as pcse, 688 as gcse from dual union all
    select to_date('08/01/2010', 'dd/mm/yyyy')      , 114        , 202         from dual union all
    select to_date('04/01/2010', 'dd/mm/yyyy')      , 115        , 705         from dual union all
    select to_date('05/01/2010', 'dd/mm/yyyy')      , 136        , 799         from dual union all
    select to_date('06/01/2010', 'dd/mm/yyyy')      ,  14        , 139         from dual union all
    select to_date('11/01/2010', 'dd/mm/yyyy')      , 160        , 576         from dual union all
    select to_date('12/01/2010', 'dd/mm/yyyy')      ,  71        , 659         from dual
    )
      ,  MaRef as
    (
    select 1 as id_ref, 'EEH_QTEPCSE' as code, 'Nombre de Petit Colis Sotckés Expédiés' as libelle from dual union all
    select 2          , 'EEH_QTEGCSE'        , 'Nombre de Gros Colis Sotckés Expédiés'             from dual
    )
      ,  MaTable2 as
    (
    select mr.code, mr.libelle,
           to_char(mt.dt,'D') as d_num,
           case mr.id_ref
             when 1 then mt.pcse
             when 2 then mt.gcse
           end as ind
      from MaTable mt
           cross join MaRef mr         
     where mt.dt between sysdate-12 and sysdate-5
    )         
      select code, libelle,
             max(case d_num when '1' then ind end) as "LUNDI",
             max(case d_num when '2' then ind end) as "MARDI",
             max(case d_num when '3' then ind end) as "MERCREDI",
             max(case d_num when '4' then ind end) as "JEUDI",
             max(case d_num when '5' then ind end) as "VENDREDI",
             max(case d_num when '6' then ind end) as "SAMEDI",
             max(case d_num when '7' then ind end) as "DIMANCHE"
        from MaTable2
    group by code, libelle;
     
    CODE		LIBELLE					LUNDI	MARDI	MERCREDI	JEUDI	VENDREDI	SAMEDI	DIMANCHE
    EEH_QTEPCSE	Nombre de Petit Colis Sotckés Expédiés	115	136	14		531	114		
    EEH_QTEGCSE	Nombre de Gros Colis Sotckés Expédiés	705	799	139		688	202
    Edit : j'ai modifié un peu la fin de la requête en rajoutant une étape supplémentaire pour alléger la syntaxe globale.

  3. #3
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2006
    Messages : 22
    Par défaut
    Houtch! c'est du costaud ça.
    Bon, je vais tenter de me plonger dedans car pour le moment, ça me parait bien compliqué

    Je te remercie, je m'atèle à la compréhension de tout cela de suite.

  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
    Il faut y aller par étape.

    Dans MaRef, c'est la table de référence de vos indicateurs que vous devriez avoir.
    Je vous conseille d'ailleurs de la créer, ça sert toujours.

    Dans MaTable2, je croise toutes les données avec toutes les références, en filtrant sur la bonne semaine.
    J'y calcule le jour de la semaine et je fais correspondre les indicateurs de la table de référence avec la colonne réelle.

    Et enfin, je termine par un pivot en fonction du jour de la semaine.

  5. #5
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2006
    Messages : 22
    Par défaut
    Je te remercie pour tes explications, mais je patoge pas mal.
    Partant du principe que tu n'as mis que des "Select ... from Dual" je me suis dit qu'en le lançant ça fonctionnerait, mais TOAD me retourne l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORA-24374: définition non exécutée après extraction ou exécution et extraction
    Je ne trouve pas des masses d'informations sur cette erreur....

  6. #6
    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
    Dans le doute j'ai retesté la requête, elle fonctionne et retourne les bons résultats.

    Testée sur une 11g et 9i.

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

Discussions similaires

  1. Problème de NULL sur un Pivot basé sur une Table Dynamique
    Par guilld dans le forum Développement
    Réponses: 3
    Dernier message: 01/08/2011, 15h05
  2. Pivoter une table autour d'une ou plusieurs colonnes
    Par freestyler dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 22/07/2008, 17h27
  3. Réponses: 3
    Dernier message: 09/06/2008, 18h59
  4. Pivoter une table en dynamique
    Par fatsora dans le forum Oracle
    Réponses: 1
    Dernier message: 03/04/2008, 12h18

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