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 :

Pivot dynamique de dates


Sujet :

SQL Oracle

  1. #1
    Membre confirmé
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Février 2019
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Février 2019
    Messages : 179
    Par défaut Pivot dynamique de dates
    Bonjour dans la requête ci-dessous, je pivote les dates en trichant sur le numéro de jour dans la clause FOR.
    J'aimerais savoir s'il existe une solution assez simple pour inclure dynamiquement les dates à la place.
    Merci pour votre aide.

    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
    SELECT * 
    FROM
    (
    SELECT /*t.DAT as DATCDG1,*/Extract(YEAR  FROM t.dat) AS ANNEECDG1,EXTRACT(MONTH FROM t.dat) as MOISCDG1,extract(day from t.dat) as day,
    /*hophjoun.jour AS JOUR1,*/e.IEISOCINTE as SITE1,
    CASE WHEN t.PROFIL in ('A1','A2') then e.NOMPRE ||' A'
    WHEN t.PROFIL in ('B1','B2') then e.NOMPRE || ' B'
    WHEN t.PROFIL in ('C1','C2') then e.NOMPRE || ' C'
    else ' '
    end as TYPO
    /*CASE WHEN HOPHJOUN.PROFIL in ('SPOCDG12N','WBCG12NPCG','GTEG12NP','WBCG12NPCG') then HOPEMPL.NOMPRE end as G12N,
    CASE WHEN HOPHJOUN.PROFIL in ('SPOCDG24','WBCG24PCG','WBEG24PCG','GTEG24P') then HOPEMPL.NOMPRE end as G24*/
    FROM  t  ,   e,  p
    WHERE e.MATRI = t.MATRI
    AND p.MATRI = e.MATRI
    AND p.MATRI = t.MATRI
    AND p.DAT = t.DAT
    AND t.PROFIL in ('A1','A2','B1', 'B2','C1','C2')
    AND EXTRACT(YEAR FROM t.DAT) >= '2023' 
    ORDER BY t.DAT
    )
    PIVOT (
    LISTAGG(TYPO,' ') WITHIN GROUP(ORDER BY TYPO )
    for day in (1 as J1, 2 as J2, 3 as J3, 4 as J4, 5 as J5, 6 as J6, 7 as J7, 8 as J8, 9 as J9, 10 as J10, 11 as J11, 12 as J12, 13 as J13, 14 as J14, 15 as J15, 16 as J16, 17 as J17, 18 as J18, 19 as J19, 20 as J20, 21 as J21,
    22 as J22, 23 as J23, 24 as J24, 25 as J25, 26 as J26, 27 as J27, 28 as J28, 29 as J29, 30 as J30, 31 as J31)
    )
    order by ANNEECDG1,MOISCDG1;

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 962
    Par défaut
    Non, il n'existe pas de PIVOT dynamique en SQL, sauf à utiliser XML PIVOT.
    Pour contourner la limitation, vous pouvez utiliser EXECUTE IMMEDIATE.
    Il existe des solutions de PIVOT dynamique basées sur un TYPE avec un PACKAGE implémentant des fonctions de lAPI ODCI ou et d'autres basées sur une Polymorphic Table Function,
    mais dans votre cas vous tomberez sur une autre limitation : elles ne supportent pas LISTAGG, sauf à plonger dans leur code et l'adapter à votre besoin...

Discussions similaires

  1. Réponses: 1
    Dernier message: 16/10/2008, 09h35
  2. [Oracle9i] Requête dynamique et date
    Par Drizzt [Drone38] dans le forum SQL
    Réponses: 7
    Dernier message: 22/04/2008, 10h15
  3. [MSSQL 2000] Pivot dynamique
    Par Dark Matter dans le forum Langage SQL
    Réponses: 10
    Dernier message: 19/02/2008, 10h30
  4. Tableau croisé dynamique et date
    Par delcroixf dans le forum Access
    Réponses: 7
    Dernier message: 31/01/2007, 16h24
  5. [MSSQL 2000] Pivot dynamique
    Par Dark Matter dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 23/02/2006, 16h59

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