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 :

Requête avec des dates [10gR2]


Sujet :

PL/SQL Oracle

  1. #1
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 360
    Points : 197
    Points
    197
    Par défaut Requête avec des dates
    Bonjour tout le monde

    Je cherche a faire une requete un peu trop compliqué pour moi

    j'ai par exemple dans ma table deux colonnes (date debut et date fin)
    je voudrais que si dans date début j'ai 15/06 et en date fin 25/08 mon select ne me ramene pas une ligne mais 3 avec :
    date debut 15/06 date fin 30/06
    date debut 01/07 date fin 31/07
    date debut 01/08 date fin 25/08

    mais je n'arrive pas a faire ce genre de découpage, j'espere que quelqu'un a des pistes
    merci beaucoup

  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
    Je ne suis pas complètement satisfait de la récupération du nombre de mois écoulé entre deux dates, mais ça fonctionne :
    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
    with MaTable as
    (
    select 1 as rid, date '2013-06-15' as dt_deb, date '2013-08-25' as dt_fin from dual union all
    select 2       , date '2012-01-13'          , date '2012-01-27'           from dual union all
    select 3       , date '2012-03-13'          , date '2012-04-10'           from dual union all
    select 4       , date '2012-06-15'          , date '2012-07-15'           from dual
    )
        select rid
             , case level
                 when 1
                 then dt_deb
                 else trunc(add_months(dt_deb, level-1), 'mm')
               end as dt_deb
             , case level
                 when floor(months_between(dt_fin, dt_deb)) + case when extract(day from dt_fin) < extract(day from dt_deb) then 2 else 1 end
                 then dt_fin
                 else last_day(add_months(dt_fin, level - floor(months_between(dt_fin, dt_deb)) - case when extract(day from dt_fin) < extract(day from dt_deb) then 2 else 1 end))
               end as dt_fin
          from MaTable
    connect by level <= floor(months_between(dt_fin, dt_deb)) + case when extract(day from dt_fin) < extract(day from dt_deb) then 2 else 1 end
           and PRIOR rid = rid
           and PRIOR DBMS_RANDOM.VALUE IS NOT NULL
      order by 1, 2;
     
    RID DT_DEB     DT_FIN
    --- ---------- ----------
      1 2013-06-15 2013-06-30
      1 2013-07-01 2013-07-31
      1 2013-08-01 2013-08-25
      2 2012-01-13 2012-01-27
      3 2012-03-13 2012-03-31
      3 2012-04-01 2012-04-10
      4 2012-06-15 2012-06-30
      4 2012-07-01 2012-07-15

  3. #3
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 360
    Points : 197
    Points
    197
    Par défaut
    merci waldar

    je vais tester pour voir si je peux l'addapter a mes tables

  4. #4
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut,

    Rigolo ton connect by Waldar, je vais essayer de comprendre

    Pour le nombre de mois, je ne sais pas si c'est mieux, mais il y a aussi ça :

    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
     
    SQL> WITH MaTable AS
      2  (
      3  SELECT 1 AS rid, date '2013-06-15' AS dt_deb, date '2013-08-25' AS dt_fin FROM dual union ALL
      4  SELECT 2       , date '2012-01-13'          , date '2012-01-27'           FROM dual union ALL
      5  SELECT 3       , date '2012-03-13'          , date '2012-04-10'           FROM dual union ALL
      6  SELECT 4       , date '2012-06-15'          , date '2012-07-15'           FROM dual
      7  )
      8  select to_char(dt_fin, 'YYYYMM') - to_char(dt_deb, 'YYYYMM') + 1 "mieux ?"
      9    , floor(months_between(dt_fin, dt_deb)) + case when extract(day FROM dt_fin) < extract(day FROM dt_deb) then 2 else 1 end "Celle qui ne te plait pas"
     10  from matable;
     
       mieux ? Celle qui ne te plait pas
    ---------- -------------------------
             3                         3
             1                         1
             2                         2
             2                         2

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  5. #5
    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
    On peut même virer les CASE en fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        select rid
             , greatest(dt_deb, trunc(add_months(dt_deb, level - 1), 'mm')) as dt_deb
             , least(dt_fin, last_day(add_months(dt_fin, level - floor(months_between(dt_fin, dt_deb)) - case when extract(day from dt_fin) < extract(day from dt_deb) then 2 else 1 end))) as dt_fin
          from MaTable
    CONNECT BY level <= floor(months_between(dt_fin, dt_deb)) + case when extract(day from dt_fin) < extract(day from dt_deb) then 2 else 1 end
           and PRIOR rid = rid
           and PRIOR DBMS_RANDOM.VALUE IS NOT NULL
      order by 1, 2;
    Edit: @pacmann, les to_char ne fonctionnent pas très bien sur un changement d'année :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select 5       , date '2013-01-02'          , date '2014-02-01'           from dual
    Edit2 : le CONNECT by prior dbms_random.value is not null c'est pour faire passer le CONNECT by directement sur les lignes d'une table unitairement.
    C'est l'astuce de l'astuce !

  6. #6
    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
    Par contre comme ça c'est nickel :
    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
    with MaTable as
    (
    select 1 as rid, date '2013-06-15' as dt_deb, date '2013-08-25' as dt_fin from dual union all
    select 2       , date '2012-01-13'          , date '2012-01-27'           from dual union all
    select 3       , date '2012-03-13'          , date '2012-04-10'           from dual union all
    select 4       , date '2012-06-15'          , date '2012-07-15'           from dual union all
    select 5       , date '2013-12-02'          , date '2014-02-01'           from dual
    )
        SELECT rid
             , greatest(dt_deb, trunc(add_months(dt_deb, level - 1), 'mm')) AS dt_deb
             , least(dt_fin, last_day(add_months(dt_fin, level - 1 - months_between(trunc(dt_fin, 'mm'), trunc(dt_deb, 'mm'))))) AS dt_fin
          FROM MaTable
    CONNECT BY level <= months_between(trunc(dt_fin, 'mm'), trunc(dt_deb, 'mm')) + 1
           AND PRIOR rid = rid
           AND PRIOR sys_guid() IS NOT NULL
      ORDER BY 1, 2;

  7. #7
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Edit: @pacmann, les to_char ne fonctionnent pas très bien sur un changement d'année :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select 5       , date '2013-01-02'          , date '2014-02-01'           from dual
    Oui je suis con, j'aurais du multiplier les années par 12 où un truc du genre... mais bon ta trouvé la formule idéal, donc tout va bien

    Citation Envoyé par Waldar Voir le message
    Edit2 : le CONNECT by prior dbms_random.value is not null c'est pour faire passer le CONNECT by directement sur les lignes d'une table unitairement.
    C'est l'astuce de l'astuce !
    Enorme, je crois que j'en ai toujours rêvé de ça !

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  8. #8
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Citation Envoyé par pacmann Voir le message
    Enorme, je crois que j'en ai toujours rêvé de ça !
    Attention à cette astuce :
    DBMS_RANDOM.value in hierarchical solution to string to table?

    Dans le domaine des astuces sys_guid() est préférable.

  9. #9
    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
    Alors va pour sys_guid(), j'édite la dernière requête.

  10. #10
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 360
    Points : 197
    Points
    197
    Par défaut
    j'ai tenté d'adapter le premiere requete de waldar mais sans succes, Db_visualiser me dit que ma commende sql ne se termine pas corectement

    voici ma requete :
    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
     
    select e.COD_COLL, e.IDF_AGENT, e.COD_RUB,
    to_date(e.DAT_DEBUT,'J'), to_date(e.DAT_FIN,'J'),
    case level
                 when 1
                 then to_date(e.DAT_DEBUT,'J')
                 else trunc(add_months(to_date(e.DAT_DEBUT,'J'), level-1), 'mm')
               end AS dt_deb,
    case level
                 when floor(months_between(to_date(e.DAT_FIN,'J'), to_date(e.DAT_DEBUT,'J'))) + case when extract(day FROM to_date(e.DAT_FIN,'J')) < extract(day FROM to_date(e.DAT_DEBUT,'J')) then 2 else 1 end
                 then to_date(e.DAT_FIN,'J')
                 else last_day(add_months(to_date(e.DAT_FIN,'J'), level - floor(months_between(to_date(e.DAT_FIN,'J'), to_date(e.DAT_DEBUT,'J'))) - case when extract(day FROM to_date(e.DAT_FIN,'J')) < extract(day FROM to_date(e.DAT_DEBUT,'J')) then 2 else 1 end))
               end AS dt_finn
    from EVP65.ELTVAR e
    connect BY level <= floor(months_between(to_date(e.DAT_FIN,'J'), to_date(e.DAT_DEBUT,'J'))) + case when extract(day FROM to_date(e.DAT_FIN,'J')) < extract(day FROM to_date(e.DAT_DEBUT,'J')) then 2 else 1 end
    where PRIOR e.COD_COLL || e.IDF_AGENT || e.COD_RUB = e.COD_COLL || e.IDF_AGENT || e.COD_RUB
    AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL
    and e.IDF_AGENT=2546
    and e.cod_rub='549N';
    vous voyez mon erreur??
    car la j'avous que je manipule plein de chose que je ne comprend absolument pas

    ps: je suis obliger de convertir mes date car elles sont stocker en format julien et je n'ais pas un index dans cette table, mon identifiant c'est 6 colonne

  11. #11
    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
    Votre syntaxe est fausse, vous avez mélangé le WHERE avec le CONNECT BY.
    Ce sont bien des clauses séparées.

    Essayez comme ceci :
    je suis reparti de la dernière version de la requête, plus compacte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        SELECT COD_COLL, IDF_AGENT, COD_RUB
             , greatest(to_date(DAT_DEBUT,'J'), trunc(add_months(to_date(DAT_DEBUT,'J'), level - 1), 'mm')) AS dt_deb
             , least(to_date(DAT_FIN,'J'), last_day(add_months(to_date(DAT_FIN,'J'), level - 1 - months_between(trunc(to_date(DAT_FIN,'J'), 'mm'), trunc(to_date(DAT_DEBUT,'J'), 'mm'))))) AS dt_fin
          FROM EVP65.ELTVAR
         WHERE IDF_AGENT = 2546
           AND cod_rub   = '549N'
    CONNECT BY level <= months_between(trunc(to_date(DAT_FIN,'J'), 'mm'), trunc(to_date(DAT_DEBUT,'J'), 'mm')) + 1
           AND PRIOR rowid = rowid
           AND PRIOR sys_guid() IS NOT NULL
      ORDER BY 1, 6;

  12. #12
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 360
    Points : 197
    Points
    197
    Par défaut
    quand je test votre modificaton j'obtiens
    14:56:51 [SELECT - 0 row(s), 0.000 secs] [Error Code: 1785, SQL State: 42000] ORA-01785: l'élément ORDER BY doit être le numéro d'une expression de la liste SELECT
    ... 1 statement(s) executed, 0 row(s) affected, exec/fetch time: 0.000/0.000 sec [0 successful, 0 warnings, 1 errors]

  13. #13
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 360
    Points : 197
    Points
    197
    Par défaut
    cette vertion
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    select e.COD_COLL, e.IDF_AGENT, e.COD_RUB,
    to_date(e.DAT_DEBUT,'J'), to_date(e.DAT_FIN,'J'),
    greatest(to_date(e.DAT_DEBUT,'J'), trunc(add_months(to_date(e.DAT_DEBUT,'J'), level - 1), 'mm')) AS dt_deb,
    least(to_date(e.DAT_FIN,'J'), last_day(add_months(to_date(e.DAT_FIN,'J'), level - 1 - months_between(trunc(to_date(e.DAT_FIN,'J'), 'mm'), trunc(to_date(e.DAT_DEBUT,'J'), 'mm'))))) AS dt_fin
    from EVP65.ELTVAR e
    where e.IDF_AGENT=2546
    and e.cod_rub='549N'
    CONNECT BY level <= months_between(trunc(to_date(e.DAT_FIN,'J'), 'mm'), trunc(to_date(e.DAT_DEBUT,'J'), 'mm')) + 1
           AND PRIOR e.COD_COLL || e.IDF_AGENT || e.COD_RUB = e.COD_COLL || e.IDF_AGENT || e.COD_RUB
           AND PRIOR sys_guid() IS NOT NULL
      ORDER BY 2, 6;
    tourne en rond ... apres 5 minute ça réfléchie toujours

  14. #14
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 360
    Points : 197
    Points
    197
    Par défaut
    si cela peux vous aidez a tester ma requete :
    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
     
    CREATE TABLE
        ELTVAR
        (
            COD_COLL VARCHAR2(5) NOT NULL,
            IDF_AGENT NUMBER(8) NOT NULL,
            IDF_CLE VARCHAR2(1),
            NUM_EMPLOI NUMBER(2) NOT NULL,
            NUM_PAIE NUMBER(1) NOT NULL,
            DAT_DEBUT NUMBER(7) NOT NULL,
            DAT_FIN NUMBER(7),
            COD_RUB VARCHAR2(4) NOT NULL,
            MNT_ELT NUMBER(8,2),
            NBR_ELT NUMBER(8,2),
            TAU_ELT NUMBER(7,3),
            COD_ELT VARCHAR2(2),
            IND_ORIGINE VARCHAR2(1),
            DAT_MAJ_J NUMBER(7),
            HEU_MAJ NUMBER(5),
            COD_VENT_BUDG VARCHAR2(5),
            TYP_VENT_BUDG VARCHAR2(2),
            NUM_CRIT NUMBER(2),
            DAT_DEB_REF NUMBER(7),
            DAT_FIN_REF NUMBER(7),
            DAT_MAJ DATE,
            USER_MAJ VARCHAR2(30),
            CLEF_ASTRE VARCHAR2(250),
            INJECTION_EN_COURS VARCHAR2(1),
            CONSTRAINT PK_ELTVAR PRIMARY KEY (COD_COLL, IDF_AGENT, NUM_EMPLOI, NUM_PAIE, DAT_DEBUT,
            COD_RUB)
        )
    voici la structure de la table
    et
    une ligne de donnée :

    CG65;2546; T;1;1;2456506;2456566;549N;305.29;(null);(null);(null);M;2454474;31515;(null);(null);(null);(null);(null);2008-01-08 08:45:15;EDSP;CG65,2546,1,1,2456506,549N;(null)

  15. #15
    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
    Avec une seule ligne, le résultat est immédiat (en corrigeant le order by 1,6 en order by 1,4) :
    COD_COLL IDF_AGENT COD_RUB DT_DEB     DT_FIN
    -------- --------- ------- ---------- ----------
    CG65          2546 549N    2013-08-01 2013-08-31
    CG65          2546 549N    2013-09-01 2013-09-30
    Au passage, pour les lignes à insérer merci de fournir des inserts :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into ELTVAR values('CG65',2546,'T',1,1,2456506,2456566,'549N',305.29,null,null,null,'M',2454474,31515,null,null,null,null,null,to_date('2008-01-08 08:45:15', 'yyyy-mm-dd hh24:mi:ss'),'EDSP','CG65,2546,1,1,2456506,549N', null);
    Combien de lignes avez-vous à travailler ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select count(*)
      from ELTVAR
     where IDF_AGENT = 2546
       AND cod_rub   = '549N';

  16. #16
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 360
    Points : 197
    Points
    197
    Par défaut
    j'ai 2583 ligne actuellement dans ma table car c'est le début d'une nouvelle période, en fin de période je me retrouve avec 35 000 ligne a traiter


    Je viens de commencer a avoir des résultat, la version de la requete sur laquel je travail commence a me donnée les résultat attendu
    je pense que je l'aurais finalisé demain, je vous montrerez la requete finale demain ou reviendrez vers vous pour solicité votre aide

    (avec des ordres insert pour que l'on travail avec les meme données)

    merci beaucoup

  17. #17
    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
    2583 lignes ce n'est pas énorme.
    Il faudrait vérifier dans le plan d'exécution si l'index de la PK est utilisé ou non, et en créer un si besoin sur les colonnes (IDF_AGENT, cod_rub) voire (COD_COLL, IDF_AGENT, cod_rub, DAT_DEBUT, DAT_FIN).

  18. #18
    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
    Pour la forme, j'avais aussi la solution via CTE Récursive (11gR2+) :
    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
    with MaTable as
    (
    select 1 as rid, date '2013-06-15' as dt_deb, date '2013-08-25' as dt_fin from dual union all
    select 2       , date '2012-01-13'          , date '2012-01-27'           from dual union all
    select 3       , date '2012-03-13'          , date '2012-04-10'           from dual union all
    select 4       , date '2012-06-15'          , date '2012-07-15'           from dual union all
    select 5       , date '2013-12-02'          , date '2014-02-01'           from dual
    )
      ,  CTE (rid, dt_deb, dt_fin, lvl) as
    (
    select rid, dt_deb, least(dt_fin, last_day(dt_deb)), 1 as lvl
      from MaTable
     union all
    select ct.rid
         , trunc(add_months(mt.dt_deb, ct.lvl), 'mm')
         , least(mt.dt_fin, last_day(add_months(mt.dt_fin, ct.lvl - months_between(trunc(mt.dt_fin, 'mm'), trunc(mt.dt_deb, 'mm')))))
         , ct.lvl + 1
      from CTE     ct
      join MaTable mt
        on mt.rid = ct.rid
     where ct.lvl <= months_between(trunc(mt.dt_fin, 'mm'), trunc(mt.dt_deb, 'mm'))
    ) cycle lvl set is_cycle to '1' default '0'
      select rid, to_char(dt_deb, 'yyyy-mm-dd') as dt_deb, to_char(dt_fin, 'yyyy-mm-dd') as dt_fin
        from CTE
    order by 1,2;
     
    RID DT_DEB     DT_FIN
    --- ---------- ----------
      1 2013-06-15 2013-06-30
      1 2013-07-01 2013-07-31
      1 2013-08-01 2013-08-25
      2 2012-01-13 2012-01-27
      3 2012-03-13 2012-03-31
      3 2012-04-01 2012-04-10
      4 2012-06-15 2012-06-30
      4 2012-07-01 2012-07-15
      5 2013-12-02 2013-12-31
      5 2014-01-01 2014-01-31
      5 2014-02-01 2014-02-01

  19. #19
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 360
    Points : 197
    Points
    197
    Par défaut
    merci waldar et les autres pour votre aide

    voici ma requête final
    elle marche ou du moins pour l'instant je n'est pas réussi a la faire bugger

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    insert into EVP65.ELTVAR_H (ELTVAR_H.COD_COLL, ELTVAR_H.IDF_AGENT, ELTVAR_H.IDF_CLE, ELTVAR_H.NUM_EMPLOI, ELTVAR_H.NUM_PAIE, ELTVAR_H.DAT_CALPAI,
     ELTVAR_H.DAT_DEBUT, ELTVAR_H.DAT_FIN, ELTVAR_H.COD_RUB, ELTVAR_H.MNT_ELT, ELTVAR_H.NBR_ELT, ELTVAR_H.TAU_ELT, ELTVAR_H.COD_ELT, ELTVAR_H.IND_ORIGINE,
     ELTVAR_H.DAT_MAJ_J, ELTVAR_H.HEU_MAJ, ELTVAR_H.COD_VENT_BUDG, ELTVAR_H.TYP_VENT_BUDG, ELTVAR_H.NUM_CRIT, ELTVAR_H.DAT_DEB_REF, ELTVAR_H.DAT_FIN_REF,
     ELTVAR_H.DAT_MAJ, ELTVAR_H.USER_MAJ)
    WITH MaTable AS
    (select 'CG65', e.AGE_CDN as idf_agent, 
    a.AGE_IDF_CLE_LB as idf_cle, 
    e.EV_NUM_EMPLOI_NB as num_emp, 
    1, 
    to_number(to_char(e.EV_DEBUT_DT,'J')) as dat_calpai, 
    to_number(to_char(e.EV_DEBUT_DT,'J')) as dat_debut,
     to_number(to_char(e.EV_FIN_DT,'J')) as dat_fin, 
     r.RUB_CODE_LB as cod_rub,  
     e.EV_MONTANT_NB, 
     e.EV_NOMBRE_NB, 
     e.EV_TAUX_NB, 
     e.ELT_CDA as cod_elt, 
     e.EV_IND_ORIGINE_CM,
     null, null, null, null, null, null, null, 
     e.EV_MODIF_DT, 
     e.EV_MODIF_LB
    from EVP65.ELEMENT_VARIABLE e, EVP65.AGENT a, EVP65.RUBRIQUE r
    where e.AGE_CDN = a.AGE_CDN (+)
    and e.RUB_CDN = r.RUB_CDN (+)
    and e.EV_CDN in (select e.EV_CDN
    from EVP65.ELEMENT_VARIABLE e
    where e.EV_RAPPEL_ON = 'O'
    and e.EV_VALIDCTRL_ON = 'O'
    and e.EV_VALIDGEST_ON = 'O'
    and e.EV_INJECTEE_ON = 'N'))
     
        SELECT 'CG65',idf_agent,idf_cle,num_emp,1, 
        to_number(to_char(greatest(to_date(DAT_DEBUT,'J'), trunc(add_months(to_date(DAT_DEBUT,'J'), level - 1), 'mm')),'J')) AS dat_calpai,
        to_number(to_char(greatest(to_date(DAT_DEBUT,'J'), trunc(add_months(to_date(DAT_DEBUT,'J'), level - 1), 'mm')),'J')) AS date_debut,
        to_number(to_char(least(to_date(DAT_FIN,'J'), last_day(add_months(to_date(DAT_FIN,'J'), level - 1 - months_between(trunc(to_date(DAT_FIN,'J'), 'mm'), trunc(to_date(DAT_DEBUT,'J'), 'mm'))))),'J'))+1 AS date_fin,
        cod_rub,
        EV_MONTANT_NB,
        EV_NOMBRE_NB, 
        EV_TAUX_NB,
        cod_elt, 
        EV_IND_ORIGINE_CM, 
        null, null, null, null, null, null, null, 
        EV_MODIF_DT, 
        EV_MODIF_LB
          FROM MaTable
    CONNECT BY level <= months_between(trunc(to_date(DAT_FIN,'J'), 'mm'), trunc(to_date(DAT_DEBUT,'J'), 'mm')) + 1
           AND PRIOR idf_agent=idf_agent
           AND PRIOR cod_rub=cod_rub
           AND prior num_emp=num_emp
           AND PRIOR sys_guid() IS NOT NULL
      ORDER BY 2,6;
    j'espere que ma requête pourra aider d'autre personne
    si vous voyer qu'elle marche mais que des modifications devrait y être apporté pour éviter d'éventuel problème ou pour optimisé les traitements ... je suis prêt a les prendre en compte

    dans tout les cas merci a tous ceux qui mon donnée des élément de réponse

  20. #20
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 360
    Points : 197
    Points
    197
    Par défaut
    Citation Envoyé par Waldar Voir le message
    2583 lignes ce n'est pas énorme.
    Il faudrait vérifier dans le plan d'exécution si l'index de la PK est utilisé ou non, et en créer un si besoin sur les colonnes (IDF_AGENT, cod_rub) voire (COD_COLL, IDF_AGENT, cod_rub, DAT_DEBUT, DAT_FIN).
    Waldar il n'y a pas de clef primaire dans cette table, enfin la PK est sur 7 colone ... c'est trop

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Requête avec des dates
    Par Daviloppeur dans le forum Requêtes
    Réponses: 3
    Dernier message: 28/05/2010, 12h28
  2. VB + Excel + SQL + Soucis requête avec des dates
    Par Invité dans le forum Excel
    Réponses: 2
    Dernier message: 12/03/2009, 08h15
  3. Requête avec des dates
    Par Danielle80 dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 04/11/2007, 12h57
  4. requête avec des dates
    Par brigdid dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 28/06/2007, 09h22
  5. SQL Requête avec des dates
    Par dahu29 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 10/03/2006, 18h20

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