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 :

calcul par fonction analytique


Sujet :

SQL Oracle

  1. #1
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    236
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 236
    Par défaut calcul par fonction analytique
    Je n'arrive pas a m'en sortir.
    J'ai une requete qui me sort les contrats de chaque salarie ainsi que le temps de travail.
    Mon souci est que lorsqu'un salarie prolonge un CDD, je dois avoir qu'une seule ligne pour ce salarie avec la date de début , la date de fin et la durée totale.
    Si par contre, le CDD est repris plus tard, ca me fait 2 CDD pour ce salarie...

    CEM_LIB CTR_LIB SAL_MATR TEMPS_ID_DEB TEMPS_ID_FIN DUREE TEM_TAUX DATE_TEMPS_CONTRAT
    Complet Durée déterminée 130207 11/07/2005 31/12/2005 173 0.0 0
    Complet Durée déterminée 130207 01/01/2006 31/03/2006 89 0.0 0
    Complet Durée déterminée 130207 01/04/2006 31/12/2006 274 0.0 0
    Complet Durée déterminée 130207 01/01/2007 31/03/2007 89 0.0 0


    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
    SELECT E.CEM_LIB
    ,CTR_LIB
    ,H.SAL_MATR
    , TO_CHAR(TO_DATE('30.12.1899', 'DD/MM/YYYY') + H.CON_DU + 2)as TEMPS_ID_DEB
    , TO_CHAR(TO_DATE('30.12.1899', 'DD/MM/YYYY') + H.CON_AU + 2)as TEMPS_ID_FIN
     
    , DECODE (H.CON_AU,'0','',(H.CON_AU) - (H.CON_DU)) as DUREE
    , HP.TEM_TAUX 
    ,HP.TEM_DATE as DATE_TEMPS_CONTRAT
    FROM SALARIE S LEFT JOIN H_CONTRAT H ON H.SAL_MATR=S.SAL_MATR
    LEFT JOIN CCMX.H_TEMPART HP ON HP.SAL_MATR=S.SAL_MATR
    LEFT JOIN AR_CONTRAT A ON A.CTR_ID=H.CTR_ID
    LEFT JOIN AR_CEMPLOI E ON E.CEM_ID=S.CEM_ID
    Merci d'avance de votre aide...

  2. #2
    Membre émérite Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Par défaut
    Salut,
    je voudrais être sûr de comprendre :
    ton soucis est qu'un salarié peut avoir de mutliples CDD, parfois bout à bout et parfois avec des "trous" entre deux ... c'est bien ça ?

    donc tu souhaites pouvoir calculer les différentes durées de travail en continuités, que chaque continuité soit composée de 1 à n CDD, pour autant que ces CDD ne présentent pas de "trous" dans leurs dates...

    exemple, pour 1 employé :
    CDD1 = du 01.01.2007 au 28.02.2007
    CDD2 = du 01.03.2007 au 30.04.2007
    CDD3 = du 01.06.2007 au 30.06.2007

    Résultat :
    Durée 1 = 4 mois (consécutifs) du 01.01.2007 au 30.04.2007 (CDD 1+2)
    Durée 2 = 1 mois du 01.06.2007 au 30.06.2007 (CDD 3)

    j'ai bon là ?

    tu bosses avec quelle version de Oracle ?

  3. #3
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    je peux imaginer quelque chose avec lag et lead du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    alter session set nls_date_format='DD/MM/YYYY';
    create table t(CEM_LIB varchar2(10),CTR_LIB varchar2(20),SAL_MATR number,TEMPS_ID_DEB date,TEMPS_ID_FIN date, TEM_TAUX number,DATE_TEMPS_CONTRAT number);
    insert into t values ('Complet','Durée déterminée',130207,'11/07/2005','31/12/2005',0.0,0);
    insert into t values ('Complet','Durée déterminée',130207,'01/01/2006','31/03/2006',0.0,0);
    insert into t values ('Complet','Durée déterminée',130207,'01/04/2006','31/12/2006',0.0,0);
    insert into t values ('Complet','Durée déterminée',130207,'01/01/2007','31/03/2007',0.0,0);
    insert into t values ('Complet','Durée déterminée',130207,'01/01/2008','31/03/2008',0.0,0);
    insert into t values ('Complet','Durée déterminée',130208,'01/01/2005','31/03/2009',0.0,0);
    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
     
    select  distinct
      SAL_MATR,
      last_value(DEB ignore nulls) over (order by TEMPS_ID_DEB) DEB,
      last_value(FIN ignore nulls) over (order by TEMPS_ID_FIN desc) FIN,
      last_value(FIN ignore nulls) over (order by TEMPS_ID_FIN desc) -
      last_value(DEB ignore nulls) over (order by TEMPS_ID_DEB) + 1 DUREE
    from (
    select
      SAL_MATR,
      TEMPS_ID_DEB,
      TEMPS_ID_FIN,
      decode(
        lag(TEMPS_ID_FIN) over (partition by sal_matr order by TEMPS_ID_FIN)+1,
        TEMPS_ID_DEB,to_date(null),
        TEMPS_ID_DEB) DEB,
      decode(
        lead(TEMPS_ID_DEB) over (partition by sal_matr order by TEMPS_ID_FIN)-1,
        TEMPS_ID_FIN,to_date(null),
        TEMPS_ID_FIN) FIN
    from t
    )
    order by 1,2,3
    ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      SAL_MATR DEB        FIN             DUREE
    ---------- ---------- ---------- ----------
        130207 11/07/2005 31/03/2007        629
        130207 01/01/2008 31/03/2008         91
        130208 01/01/2005 31/03/2009       1551

  4. #4
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    236
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 236
    Par défaut
    Citation Envoyé par Yorglaa Voir le message
    Salut,
    exemple, pour 1 employé :
    CDD1 = du 01.01.2007 au 28.02.2007
    CDD2 = du 01.03.2007 au 30.04.2007
    CDD3 = du 01.06.2007 au 30.06.2007

    Résultat :
    Durée 1 = 4 mois (consécutifs) du 01.01.2007 au 30.04.2007 (CDD 1+2)
    Durée 2 = 1 mois du 01.06.2007 au 30.06.2007 (CDD 3)


    tu bosses avec quelle version de Oracle ?
    Oui c'est bien ca, tu as tt compris.

    Je bosse avec la version 9i d'Oracle.

  5. #5
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    236
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 236
    Par défaut
    J'ai testé la requete avec mes champs en plus.
    Ca donne ca:


    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
     
    SELECT  DISTINCT
      H.SAL_MATR,
      last_value(DEB IGNORE nulls) over (ORDER BY TO_CHAR(TO_DATE('30.12.1899', 'DD/MM/YYYY') + H.CON_DU + 2)) DEB,
      last_value(FIN IGNORE nulls) over (ORDER BY TO_CHAR(TO_DATE('30.12.1899', 'DD/MM/YYYY') + H.CON_AU + 2) DESC) FIN,
      last_value(FIN IGNORE nulls) over (ORDER BY TO_CHAR(TO_DATE('30.12.1899', 'DD/MM/YYYY') + H.CON_AU + 2) DESC) -
      last_value(DEB IGNORE nulls) over (ORDER BY TO_CHAR(TO_DATE('30.12.1899', 'DD/MM/YYYY') + H.CON_DU + 2)) + 1 DUREE
    , HP.TEM_TAUX 
    ,HP.TEM_DATE as DATE_TEMPS_CONTRAT
    FROM (
    SELECT
      TO_CHAR(TO_DATE('30.12.1899', 'DD/MM/YYYY') + H.CON_DU + 2) as TEMPS_ID_DEB,
     TO_CHAR(TO_DATE('30.12.1899', 'DD/MM/YYYY') + H.CON_AU + 2)as TEMPS_ID_FIN,
      decode(
        lag(TO_CHAR(TO_DATE('30.12.1899', 'DD/MM/YYYY') + H.CON_AU + 2)) over (partition BY sal_matr ORDER BY TO_CHAR(TO_DATE('30.12.1899', 'DD/MM/YYYY') + H.CON_AU + 2))+1,
        TO_CHAR(TO_DATE('30.12.1899', 'DD/MM/YYYY') + H.CON_DU + 2),to_date(NULL),
        TO_CHAR(TO_DATE('30.12.1899', 'DD/MM/YYYY') + H.CON_DU + 2)) DEB,
      decode(
        lead(TO_CHAR(TO_DATE('30.12.1899', 'DD/MM/YYYY') + H.CON_DU + 2)) over (partition BY sal_matr ORDER BY TO_CHAR(TO_DATE('30.12.1899', 'DD/MM/YYYY') + H.CON_AU + 2))-1,
        TO_CHAR(TO_DATE('30.12.1899', 'DD/MM/YYYY') + H.CON_AU + 2),to_date(NULL),
        TO_CHAR(TO_DATE('30.12.1899', 'DD/MM/YYYY') + H.CON_AU + 2)) FIN
    , HP.TEM_TAUX 
    ,HP.TEM_DATE as DATE_TEMPS_CONTRAT
     
    FROM SALARIE S LEFT JOIN H_CONTRAT H ON H.SAL_MATR=S.SAL_MATR
    LEFT JOIN CCMX.H_TEMPART HP ON HP.SAL_MATR=S.SAL_MATR
    LEFT JOIN AR_CONTRAT A ON A.CTR_ID=H.CTR_ID
    LEFT JOIN AR_CEMPLOI E ON E.CEM_ID=S.CEM_ID
    )
    FROM SALARIE S LEFT JOIN H_CONTRAT H ON H.SAL_MATR=S.SAL_MATR
    LEFT JOIN CCMX.H_TEMPART HP ON HP.SAL_MATR=S.SAL_MATR
    LEFT JOIN AR_CONTRAT A ON A.CTR_ID=H.CTR_ID
    LEFT JOIN AR_CEMPLOI E ON E.CEM_ID=S.CEM_ID
     
    ORDER BY 1,2,3
    Mais par contre, oracle me renvoie:

    ORA-00933: la commande SQL ne se termine pas correctement

    Je n'ai aucune idée de mon erreur...

  6. #6
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    hélas IGNORE NULLS c'est du 10g. Un peu de patience pendant que j'écris qqch pour 9i

  7. #7
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    on peut la tenter avec un max

    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
     
    select * from (
    SELECT
    SAL_MATR,
    max(DEB) over (partition by sal_matr ORDER BY TEMPS_ID_DEB) DEB,
    max(FIN) over (partition by sal_matr ORDER BY TEMPS_ID_DEB ) FIN
    FROM (
    SELECT
    SAL_MATR,
    TEMPS_ID_DEB,
    decode(
    lag(TEMPS_ID_FIN) over (partition BY sal_matr ORDER BY TEMPS_ID_FIN)+1,
    TEMPS_ID_DEB,to_date(NULL),
    TEMPS_ID_DEB) DEB,
    decode(
    lead(TEMPS_ID_DEB) over (partition BY sal_matr ORDER BY TEMPS_ID_FIN)-1,
    TEMPS_ID_FIN,to_date(NULL),
    TEMPS_ID_FIN) FIN
    FROM t
    )
    )
    where deb is not null and fin is not null
    ORDER BY 1,2,3;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      SAL_MATR DEB                 FIN
    ---------- ------------------- -------------------
        130207 11.07.2005 00:00:00 31.03.2007 00:00:00
        130207 01.01.2008 00:00:00 31.03.2008 00:00:00
        130208 01.01.2005 00:00:00 31.03.2009 00:00:00

  8. #8
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    236
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 236
    Par défaut
    Dans un premier temps, quand j'essaye d'executer la requete interne, Oracle me sort :

    Couldn't get row from result set
    ORA-01722: Nombre non valide


    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
     
    SELECT
    H.SAL_MATR,
      TO_CHAR(TO_DATE('30.12.1899', 'DD/MM/YYYY') + H.CON_DU + 2) as TEMPS_ID_DEB,
     TO_CHAR(TO_DATE('30.12.1899', 'DD/MM/YYYY') + H.CON_AU + 2)as TEMPS_ID_FIN,
      decode(
        lag(TO_CHAR(TO_DATE('30.12.1899', 'DD/MM/YYYY') + H.CON_AU + 2)) over (partition BY H.SAL_MATR ORDER BY TO_CHAR(TO_DATE('30.12.1899', 'DD/MM/YYYY') + H.CON_AU + 2))+1,
        TO_CHAR(TO_DATE('30.12.1899', 'DD/MM/YYYY') + H.CON_DU + 2),to_date(NULL),
        TO_CHAR(TO_DATE('30.12.1899', 'DD/MM/YYYY') + H.CON_DU + 2)) DEB,
      decode(
        lead(TO_CHAR(TO_DATE('30.12.1899', 'DD/MM/YYYY') + H.CON_DU + 2)) over (partition BY H.SAL_MATR ORDER BY TO_CHAR(TO_DATE('30.12.1899', 'DD/MM/YYYY') + H.CON_AU + 2))-1,
        TO_CHAR(TO_DATE('30.12.1899', 'DD/MM/YYYY') + H.CON_AU + 2),to_date(NULL),
        TO_CHAR(TO_DATE('30.12.1899', 'DD/MM/YYYY') + H.CON_AU + 2)) FIN
    , HP.TEM_TAUX 
    ,HP.TEM_DATE as DATE_TEMPS_CONTRAT
     
    FROM SALARIE S LEFT JOIN H_CONTRAT H ON H.SAL_MATR=S.SAL_MATR
    LEFT JOIN CCMX.H_TEMPART HP ON HP.SAL_MATR=S.SAL_MATR
    LEFT JOIN AR_CONTRAT A ON A.CTR_ID=H.CTR_ID
    LEFT JOIN AR_CEMPLOI E ON E.CEM_ID=S.CEM_ID
    Il ne doit pas reussir a faire les calculs sur les dates...

  9. #9
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    enlève les TO_CHAR

  10. #10
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    236
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 236
    Par défaut
    Je commence a y voir plus clair, par contre encore un ptit souci...

    Je vais cette 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
    32
     
    SELECT
    CEM_LIB
    ,CTR_LIB
    ,SAL_MATR
    ,max(DEB) over (partition BY sal_matr,CEM_LIB,CTR_LIB  ORDER BY  TEMPS_ID_DEB) as  DEB
    ,max(FIN) over (partition BY sal_matr,CEM_LIB,CTR_LIB  ORDER BY TEMPS_ID_FIN) as FIN
    FROM 
    (SELECT
    E.CEM_LIB
    ,CTR_LIB,
    H.SAL_MATR,
    TO_DATE('30.12.1899', 'DD/MM/YYYY') + H.CON_DU + 2 as TEMPS_ID_DEB,
    TO_DATE('30.12.1899', 'DD/MM/YYYY') + H.CON_AU + 2 as TEMPS_ID_FIN,
    decode(
        lag(TO_DATE('30.12.1899', 'DD/MM/YYYY') + H.CON_AU + 2) over (partition BY sal_matr ORDER BY TO_DATE('30.12.1899', 'DD/MM/YYYY') + H.CON_AU + 2)+1,
        TO_DATE('30.12.1899', 'DD/MM/YYYY') + H.CON_DU + 2,to_date(NULL),
       TO_DATE('30.12.1899', 'DD/MM/YYYY') + H.CON_DU + 2) DEB,
      decode(
        lead(TO_DATE('30.12.1899', 'DD/MM/YYYY') + H.CON_DU + 2) over (partition BY sal_matr ORDER BY TO_DATE('30.12.1899', 'DD/MM/YYYY') + H.CON_AU + 2)-1,
        TO_DATE('30.12.1899', 'DD/MM/YYYY') + H.CON_AU + 2,to_date(NULL),
        TO_DATE('30.12.1899', 'DD/MM/YYYY') + H.CON_AU + 2) FIN
    , HP.TEM_TAUX 
    ,HP.TEM_DATE as DATE_TEMPS_CONTRAT
     
    FROM SALARIE S LEFT JOIN H_CONTRAT H ON H.SAL_MATR=S.SAL_MATR
    LEFT JOIN CCMX.H_TEMPART HP ON HP.SAL_MATR=S.SAL_MATR
    LEFT JOIN AR_CONTRAT A ON A.CTR_ID=H.CTR_ID
    LEFT JOIN AR_CEMPLOI E ON E.CEM_ID=S.CEM_ID
    WHERE H.SAL_MATR=130207)
     
    WHERE  DEB is not null AND FIN is not null
    Celle ci me renvoie rien.
    Par contre, qd j'enleve la derniere ligne, j'obtiens:

    CEM_LIB CTR_LIB SAL_MATR DEB FIN
    Complet Durée déterminée 130207 11/07/2005
    Complet Durée déterminée 130207 11/07/2005
    Complet Durée déterminée 130207 11/07/2005
    Complet Durée déterminée 130207 11/07/2005 31/03/2007


    Je n'arrive pas a obtenir seulement la derniere ligne...meme en jouant sur les OR et AND...(soit j'ai que le DEB ou que FIN)

  11. #11
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    max(FIN) over (partition BY sal_matr,CEM_LIB,CTR_LIB ORDER BY TEMPS_ID_DEB) AS FIN

  12. #12
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    236
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 236
    Par défaut
    Citation Envoyé par laurentschneider Voir le message
    max(FIN) over (partition BY sal_matr,CEM_LIB,CTR_LIB ORDER BY TEMPS_ID_DEB) AS FIN
    J'avais essayé,mais ca me renvoie aucune donnée....

  13. #13
    Membre émérite Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Par défaut
    essaye avec celle-ci (basée sur le testcase de LaurentSchneider) :
    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
    With 
        T1 as (
                Select 
                        t.*
                        , decode(
                                    TEMPS_ID_DEB 
                                    ,lag(TEMPS_ID_FIN) over(partition by SAL_MATR  order by TEMPS_ID_DEB ) + 1 
                                    ,0
                                    ,1
                                ) Continuity
                From    t
              )
    ,   T2 as (
                Select 
                        T1.*
                        , sum(Continuity) over(order by SAL_MATR ,TEMPS_ID_DEB ) Analyzed
                From    T1
              )
    Select 
            SAL_MATR 
            , min(TEMPS_ID_DEB ) TEMPS_ID_DEB 
            , max(TEMPS_ID_FIN ) TEMPS_ID_FIN 
            , max(TEMPS_ID_FIN ) 
              -
              min(TEMPS_ID_DEB ) 
              + 1 as Duree
            , TEM_TAUX 
            , DATE_TEMPS_CONTRAT 
    From    T2
    Group by Analyzed, SAL_MATR, TEM_TAUX, DATE_TEMPS_CONTRAT
    Order by SAL_MATR , TEMPS_ID_DEB

  14. #14
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    236
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 236
    Par défaut
    Cette requete fonctionne comme l'autre..
    Des que je cherche le cas que j'ai cité dans le premier post et bien je n'ai plus de données...
    Par contre, les cas "normaux" passent avec les 2 requetes.
    Je pense que la 1ere requete de Laurentschneider n'est pas tres loin, mais je ne vois pas du tout pourquoi je n'arrive pas a avoir les dates de debut et de fin sur la meme ligne..

  15. #15
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    236
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 236
    Par défaut
    Vous croyez qu'il existe une autre solution pour resoudre ce calcul?
    Si vous pensez que par d'autres moyens je peux y arriver, je suis a votre ecoute...
    la je suis désespérée car je dois rendre la requete a mes utilisateurs demain...

  16. #16
    Membre émérite Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Par défaut
    Citation Envoyé par steinia Voir le message
    Cette requete fonctionne comme l'autre..
    Des que je cherche le cas que j'ai cité dans le premier post et bien je n'ai plus de données...
    Par contre, les cas "normaux" passent avec les 2 requetes.
    Je pense que la 1ere requete de Laurentschneider n'est pas tres loin, mais je ne vois pas du tout pourquoi je n'arrive pas a avoir les dates de debut et de fin sur la meme ligne..

    je ne comprends pas quel est le cas qui te pose problème...
    est-ce tu peux nous donner les donnée qui bloquent, le résultat attendu et le résultat obtenu ? de manière à pouvoir faire une testcase avec tes données problèmatiques...

    parce que il me semblais que le testcase créé par Laurentschneider couvrait déjà les données que tu donnes dans le Post no 1

  17. #17
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    236
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 236
    Par défaut
    Voila le cas que j'obtiens actuellement:


    CEM_LIB CTR_LIB SAL_MATR TEMPS_ID_DEB TEMPS_ID_FIN DUREE TEM_TAUX DATE_TEMPS_CONTRAT
    Complet Durée déterminée 130207 11/07/2005 31/12/2005 173 0.0 0
    Complet Durée déterminée 130207 01/01/2006 31/03/2006 89 0.0 0
    Complet Durée déterminée 130207 01/04/2006 31/12/2006 274 0.0 0
    Complet Durée déterminée 130207 01/01/2007 31/03/2007 89 0.0 0
    Complet Durée déterminée 190001 15/03/2007 15/06/2007 94 0.0 0

    Et j'aimerais obtenir:
    CEM_LIB CTR_LIB SAL_MATR TEMPS_ID_DEB TEMPS_ID_FIN DUREE TEM_TAUX DATE_TEMPS_CONTRAT
    Complet Durée déterminée 130207 11/07/2005 31/03/2007 625 0.0 0
    Complet Durée déterminée 190001 15/03/2007 15/06/2007 94 0.0 0

    En faisant cette requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT E.CEM_LIB
    ,CTR_LIB
    ,H.SAL_MATR
    , TO_CHAR(TO_DATE('30.12.1899', 'DD/MM/YYYY') + H.CON_DU + 2)AS TEMPS_ID_DEB
    , TO_CHAR(TO_DATE('30.12.1899', 'DD/MM/YYYY') + H.CON_AU + 2)AS TEMPS_ID_FIN
     
    , DECODE (H.CON_AU,'0','',(H.CON_AU) - (H.CON_DU)) AS DUREE
    , HP.TEM_TAUX 
    ,HP.TEM_DATE AS DATE_TEMPS_CONTRAT
    FROM SALARIE S LEFT JOIN H_CONTRAT H ON H.SAL_MATR=S.SAL_MATR
    LEFT JOIN CCMX.H_TEMPART HP ON HP.SAL_MATR=S.SAL_MATR
    LEFT JOIN AR_CONTRAT A ON A.CTR_ID=H.CTR_ID
    LEFT JOIN AR_CEMPLOI E ON E.CEM_ID=S.CEM_ID
    C'est peut etre parce que je fais des left join...

    J'espere avoir repondu a ta question...

  18. #18
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    236
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 236
    Par défaut
    Pas d'idée?

  19. #19
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Sans fonction analytique, avec un connect by :
    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
    WITH t AS (
    	SELECT 130207 AS mat, TO_DATE('11/07/2005', 'DD/MM/YYYY') date_deb, TO_DATE('31/12/2005', 'DD/MM/YYYY') date_fin FROM dual
    UNION ALL
    	SELECT 130207 AS mat, TO_DATE('01/01/2006', 'DD/MM/YYYY') date_deb, TO_DATE('31/03/2006', 'DD/MM/YYYY') date_fin FROM dual
    UNION ALL
    	SELECT 130207 AS mat, TO_DATE('01/04/2006', 'DD/MM/YYYY') date_deb, TO_DATE('31/12/2006', 'DD/MM/YYYY') date_fin FROM dual
    UNION ALL
    	SELECT 130207 AS mat, TO_DATE('01/02/2007', 'DD/MM/YYYY') date_deb, TO_DATE('31/03/2007', 'DD/MM/YYYY') date_fin FROM dual
    UNION ALL
    	SELECT 130208 AS mat, TO_DATE('01/01/2007', 'DD/MM/YYYY') date_deb, TO_DATE('31/12/2007', 'DD/MM/YYYY') date_fin FROM dual
    	)
    SELECT mat, MIN(debut) debut, fin
    FROM (
    	SELECT mat, debut, MAX(fin) AS fin
    	FROM 
    		(SELECT LEVEL, SYS_CONNECT_BY_PATH(TO_CHAR(date_deb, 'DD.MM.YYYY'), ' ') AS chemin,
    			mat, date_deb, date_fin,
    			TO_DATE(SUBSTR(SYS_CONNECT_BY_PATH(TO_CHAR(date_deb, 'DD/MM/YYYY'), ' ') , 2,10), 'DD/MM/YYYY') AS debut,
    			date_fin fin
    		FROM t
    		CONNECT BY mat = PRIOR mat
    		AND date_deb  = PRIOR date_fin + 1
    		)
    	GROUP BY mat, debut
    		)
    GROUP BY mat, fin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MAT	DEBUT		FIN
    130207	11/07/2005	31/12/2006
    130207	01/02/2007	31/03/2007
    130208	01/01/2007	31/12/2007

  20. #20
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Avec tes données ça marche bien (1 ligne seulement pour 130207 )
    J'avais modifié pour avoir un cas de trou.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 26/08/2009, 09h53
  2. [XL-2003] Calcul par itération et fonction valeur cible
    Par allergique dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 19/04/2009, 10h26
  3. Calcul d'une fonction analytique inverse
    Par matxl dans le forum Mathématiques
    Réponses: 3
    Dernier message: 31/05/2008, 14h15
  4. Réponses: 7
    Dernier message: 21/08/2007, 10h53
  5. Réponses: 4
    Dernier message: 28/09/2005, 09h19

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