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

PL/SQL Oracle Discussion :

PL/SQL mise a jour complexe


Sujet :

PL/SQL Oracle

  1. #1
    Membre du Club

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4
    Points : 67
    Points
    67
    Par défaut PL/SQL mise a jour complexe
    Bonjour,
    J'ai la table suivante :
    ID |DEBUT |FIN |PERIODE|
    1 |02/01/2010 |02/02/2010|MENSUEL|
    1 |03/02/2010 |03/03/2010|MENSUEL|
    1 |04/03/2010 |04/06/2010|TRIMESTRIEL|
    1 |05/06/2010 |05/07/2010|MENSUEL|
    1 |05/07/2010 |05/07/2011|ANNUEL|
    1 |05/07/2011 |05/08/2011|MENSUEL|
    1 |06/08/2011 |06/09/2011|MENSUEL|
    et je veux les insérer dans une nouvelle table de la manière suivante :
    ID |DEBUT |FIN |PERIODE|
    1 |02/01/2010 |03/03/2010|MENSUEL| --> regroupement ligne 1 et ligne 2
    1 |04/03/2010 |04/06/2010|TRIMESTRIEL| --> ligne 3
    1 |05/06/2010 |05/07/2010|MENSUEL| -->ligne 4
    1 |05/07/2010 |05/07/2011|ANNUEL|-->ligne 5
    1 |05/07/2011 |06/09/2011|MENSUEL|ligne 6 + 7
    A noter que mes données sont ordonnées par date de début.
    Les données sont regroupée par même période consécutive.


    Je suis passé par du java pour le faire, je n'ai pas eu de soucis, j'aimerais le faire en pl/sql étant donné qu'il s'agit d'un script de migration.

    Merci d'avance

  2. #2
    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 820
    Points
    17 820
    Par défaut
    En utilisant la méthode Tabibitosan :
    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 MaTable as
    (
    select 1 as id, date '2010-01-02' as debut, date '2010-02-02' as fin, 'MENSUEL' as periode from dual union all
    select 1      , date '2010-02-03'         , date '2010-03-03'       , 'MENSUEL'            from dual union all
    select 1      , date '2010-03-04'         , date '2010-06-04'       , 'TRIMESTRIEL'        from dual union all
    select 1      , date '2010-06-05'         , date '2010-07-05'       , 'MENSUEL'            from dual union all
    select 1      , date '2010-07-05'         , date '2011-07-05'       , 'ANNUEL'             from dual union all
    select 1      , date '2011-07-05'         , date '2011-08-05'       , 'MENSUEL'            from dual union all
    select 1      , date '2011-08-06'         , date '2011-09-06'       , 'MENSUEL'            from dual
    )
      ,  SR as
    (
    select id, debut, fin, periode,
           row_number() over(partition by id          order by debut asc) -
           row_number() over(partition by id, periode order by debut asc) as grp
      from MaTable
    )
      select id, min(debut) as debut, max(fin) as fin, periode
        from SR
    group by id, periode, grp
    order by id, debut;
     
            ID DEBUT      FIN        PERIODE    
    ---------- ---------- ---------- -----------
             1 02/01/2010 03/03/2010 MENSUEL    
             1 04/03/2010 04/06/2010 TRIMESTRIEL
             1 05/06/2010 05/07/2010 MENSUEL    
             1 05/07/2010 05/07/2011 ANNUEL     
             1 05/07/2011 06/09/2011 MENSUEL

  3. #3
    Membre du Club

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4
    Points : 67
    Points
    67
    Par défaut
    Citation Envoyé par Waldar Voir le message
    En utilisant la méthode Tabibitosan :
    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 MaTable as
    (
    select 1 as id, date '2010-01-02' as debut, date '2010-02-02' as fin, 'MENSUEL' as periode from dual union all
    select 1      , date '2010-02-03'         , date '2010-03-03'       , 'MENSUEL'            from dual union all
    select 1      , date '2010-03-04'         , date '2010-06-04'       , 'TRIMESTRIEL'        from dual union all
    select 1      , date '2010-06-05'         , date '2010-07-05'       , 'MENSUEL'            from dual union all
    select 1      , date '2010-07-05'         , date '2011-07-05'       , 'ANNUEL'             from dual union all
    select 1      , date '2011-07-05'         , date '2011-08-05'       , 'MENSUEL'            from dual union all
    select 1      , date '2011-08-06'         , date '2011-09-06'       , 'MENSUEL'            from dual
    )
      ,  SR as
    (
    select id, debut, fin, periode,
           row_number() over(partition by id          order by debut asc) -
           row_number() over(partition by id, periode order by debut asc) as grp
      from MaTable
    )
      select id, min(debut) as debut, max(fin) as fin, periode
        from SR
    group by id, periode, grp
    order by id, debut;
     
            ID DEBUT      FIN        PERIODE    
    ---------- ---------- ---------- -----------
             1 02/01/2010 03/03/2010 MENSUEL    
             1 04/03/2010 04/06/2010 TRIMESTRIEL
             1 05/06/2010 05/07/2010 MENSUEL    
             1 05/07/2010 05/07/2011 ANNUEL     
             1 05/07/2011 06/09/2011 MENSUEL
    Merci pour la solution, je l'ai adapté, elle marche très bien.
    Encore merci.

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

Discussions similaires

  1. Requête de Mise a jour complexe
    Par devalender dans le forum SQL
    Réponses: 11
    Dernier message: 03/02/2012, 17h50
  2. Réponses: 3
    Dernier message: 08/02/2011, 11h09
  3. Requete SQL Mise a jour table issu d'un txt
    Par ARTAMYS dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 04/08/2008, 12h13
  4. [SQL]Mise a jour sans passer par du code
    Par hackel dans le forum Access
    Réponses: 7
    Dernier message: 06/04/2007, 09h13
  5. [ORACLE 9] Mise à jour complexe ?
    Par Matzke.claudio dans le forum Langage SQL
    Réponses: 1
    Dernier message: 13/11/2006, 11h58

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