Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 04/10/2011, 15h40   #1
Membre à l'essai
 
Inscription : décembre 2008
Messages : 4
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 4
Points : 23
Points : 23
Par défaut PL/SQL mise a jour complexe

Bonjour,
J'ai la table suivante :
Citation:
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 :
Citation:
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
pierre2008 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2011, 16h32   #2
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 686
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 686
Points : 10 431
Points : 10 431
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
En utilisant la méthode Tabibitosan :
Code :
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
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 04/10/2011, 18h10   #3
Membre à l'essai
 
Inscription : décembre 2008
Messages : 4
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 4
Points : 23
Points : 23
Citation:
Envoyé par Waldar Voir le message
En utilisant la méthode Tabibitosan :
Code :
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.
pierre2008 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h10.


 
 
 
 
Partenaires

Hébergement Web