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 :

requete simple avec date


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 requete simple avec date
    J'ai une requete a priori simple que je n'arrive pas a effectuer...
    Je dois etre fatiguée la..

    J'ai les dates de changements de statut de personne:
    Par ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CAT_ID	TPS
    E	2003/01/01 00:00:00.000
    C	2004/07/01 00:00:00.000
    J'aimerais en fait recuperer le statut de la personne sur une année précise..
    Par ex:
    en 2007, je voudrais C
    Mais en 2003, c'est E.

    Les dates sont calculées en faisant :
    pour 2007:to_date('31/12/' || (to_char(sysdate,'yyyy')),'DD/MM/YYYY')
    pour 2006:to_date('31/12/' || (to_char(sysdate,'yyyy')-1),'DD/MM/YYYY')

    Je n'arrive plus a faire mes requetes :-(

  2. #2
    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
    Ben soit tu as la fonction extract qui te renvoie un nombre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT EXTRACT (YEAR FROM TPS)
    Soit le to_char qui te renvoie du char
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT TO_NUMBER(TO_CHAR(TPS, 'YYYY'))

  3. #3
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT EXTRACT (YEAR FROM SYSDATE), TO_CHAR(SYSDATE, 'YYYY')
    FROM dual
    EXTRACT(YEARFROMSYSDATE)	TO_CHAR(SYSDATE,'YYYY')
    		    2007	2007

  4. #4
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    236
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 236
    Par défaut
    Non mon souci ce n'est pas d'extraire l'année...C'est que j'aimerais récupérer la categorie de la personne en fonction d'une date..

    Selon mon exemple dans le 1er post:
    En 2003: la catégorie est 'E'
    En 2004: la catégorie est 'C'
    En 2005: la catégorie est 'C'
    En 2006: la catégorie est 'C'
    En 2007: la catégorie est 'C'

    Par ex, si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Select cat_id
    from h_categ
    where tps <= to_date('31/12/' || to_char(sysdate,'yyyy')),'DD/MM/YYYY')
    il me sort C et E. Ce qui est normal.

    Mais moi je veux que C pour 2007.

    Si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Select cat_id
    from h_categ
    where tps <= to_date('31/12/' || to_char(sysdate,'yyyy')-4),'DD/MM/YYYY')
    Je voudrais qu'il me sorte 'E'

  5. #5
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2
    Par défaut
    Quand tu as une table d'historique qui n'a qu'une date d'effet il faut que tu te limite à la ligne qui a la date la plus grande répondant à ton critère soit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT cat_id
    FROM h_categ
    WHERE tps=(SELECT MAX(tps) 
               FROM h_categ
               WHERE tps <= to_date('31/12/' || to_char(sysdate,'yyyy')),'DD/MM/YYYY'))
    Bon là c'est avec une sous-requête mais je n'ai pas le temps de réfléchir si on peut s'en passer. Et en plus il faut ramener tout ça au bon employé j'imagine.

    En général c'est plus simple si tu as une date de début et une date de fin au lieu d'une date d'effet.

  6. #6
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    236
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 236
    Par défaut
    Quand je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select cat_id ,TO_DATE('30/12/1899', 'DD/MM/YYYY') + hca_date + 2 as tps  
    from h_categ
    where 
    sal_matr=130141
    and 
    TO_DATE('30/12/1899', 'DD/MM/YYYY') + hca_date + 2 <= (select MAX(TO_DATE('30/12/1899', 'DD/MM/YYYY') + hca_date + 2 )  from h_categ where (TO_DATE('30/12/1899', 'DD/MM/YYYY') + hca_date + 2 )<= '31/12/2007'
    and sal_matr=130141)
    Il me renvoie encore les 2 catégories et non celle qui convient...

    J'ai l'impression qu'il n'arrive pas a faire le MAX sur la date

  7. #7
    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
    Je ne comprend rien à ta requete.

    Donne un exemple réel des données de ta table h_categ

  8. #8
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    236
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 236
    Par défaut
    Comme je l'ai mis dans mon post 1:

    Quand je fais cette requete:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select cat_id ,TO_DATE('30/12/1899', 'DD/MM/YYYY') + hca_date + 2 as tps  
    from h_categ
    where 
    sal_matr=130141
    J'obtiens ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CAT_ID	TPS
    E	2003/01/01 00:00:00.000
    C	2004/07/01 00:00:00.000
    Ce sont les changements de catégorie du matricule à une date précise.

    Et mon pb, c'est que j'aimerais, à chaque 31/12 d'une année, récupérer le CAT_ID qui convient.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 68
    Par défaut
    Peut-il y avoir deux changement de catégorie dans la même année ?

  10. #10
    Membre expérimenté Avatar de Loyd1974
    Profil pro
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Par défaut
    un truc dans ce style peut-être:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT cat_id, tps
    FROM (
          SELECT cat_id ,TO_DATE('30/12/1899', 'DD/MM/YYYY') + hca_date + 2 AS tps  
          FROM h_categ
          WHERE sal_matr=130141
          AND (TO_DATE('30/12/1899', 'DD/MM/YYYY') + hca_date + 2) <= TO_DATE('31/12/2003','DD/MM/YYYY')
          ORDER BY 2 DESC
    )
    WHERE ROWNUM =1
    Edit: bien évidemment le 31/12/2003 sera ton paramètre

  11. #11
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    236
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 236
    Par défaut
    Oui a priori ca pourrait arriver...

  12. #12
    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
    message supprimé : En fait j'avais rien compris

  13. #13
    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
    Pour avoir chaque dernier cat_id de chaque année

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT DISTINCT cat_id, 
    		--TO_DATE('30/12/1899', 'DD/MM/YYYY') + hca_date + 2 AS tps, 
    	   first_value(cat_id) OVER( PARTITION BY EXTRACT  (YEAR FROM TO_DATE('30/12/1899', 'DD/MM/YYYY') + hca_date + 2) ORDER BY hca_date DESC) AS dernier_cat_annee
    FROM h_categ
    WHERE sal_matr=130141

  14. #14
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    236
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 236
    Par défaut
    J'ai récupéré la requete de Loyd1974 qui fonctionne super bien 'pour un cas' (lorsque je mets le matricule).
    Par contre j'integre cette nouvelle requete dans une autre requete qui lit chaque matricule.
    Comme numrow=1, la grde requete me sort qu'une seule ligne alors que je voudrait une ligne par matricule...

    Voici ma requete:

    select DISTINCT

    S.SAL_NOSS
    , CS.SAL_MATR as MATRICULE
    ,(TO_DATE('30/12/1899', 'DD/MM/YYYY') + CS.POT_DU + 2) as appo
    , MAX(CS.POT_VAL) as REMU_THEO_BASE
    , decode(categ.CAT_ID,'C',CS.POT_VAL) as REMU_THEO_CADRE_13
    , decode(categ.CAT_ID,'E',CS.POT_VAL) as REMU_THEO_ETAM_13
    , '31/12/' || (to_char(sysdate,'yyyy')) as TEMPS_ID

    FROM
    (
    SELECT h.cat_id , sal_matr, TO_DATE('30/12/1899', 'DD/MM/YYYY') + h.hca_date + 2 AS date_categ
    FROM h_categ h
    WHERE(TO_DATE('30/12/1899', 'DD/MM/YYYY') + h.hca_date + 2) <= to_date('31/12/' || (to_char(sysdate,'yyyy')),'DD/MM/YYYY')

    ORDER BY 3 DESC ) categ


    , SALARIE S, CONST_SAL CS
    where categ.sal_matr=s.sal_matr
    and CS.ARC_ID ='APPO'
    and s.SAL_MATR=CS.SAL_MATR
    and CS.MON_ID = 'EUR'
    and (CS.POT_DU) = (select max(APPO.POT_DU)
    FROM CONST_SAL APPO
    WHERE APPO.ARC_ID ='APPO'
    and APPO.MON_ID = 'EUR'
    and APPO.SAL_MATR=CS.SAL_MATR
    and (TO_DATE('30/12/1899', 'DD/MM/YYYY') + APPO.POT_DU + 2)<=to_date('31/12/' || (to_char(sysdate,'yyyy')),'DD/MM/YYYY')
    )
    AND CS.SAL_MATR not in(SELECT SAL_MATR
    FROM CONST_SAL
    WHERE ARC_ID ='OBAN'
    AND (TO_DATE('30/12/1899', 'DD/MM/YYYY') + POT_DU + 2)<=to_date('31/12/' || (to_char(sysdate,'yyyy')),'DD/MM/YYYY')
    )
    AND CS.SAL_MATR NOT IN (SELECT SAL_MATR
    FROM CCMX.H_ES_SAUV HS
    WHERE TO_DATE('30/12/1899', 'DD/MM/YYYY') + HS.E_S_DATES + 2 <= ('31/12/' || (to_char(sysdate,'yyyy')))
    AND HS.MES_IDS IN ('RS','LG','RA','LE','FX','DE','CN','LL','LF','LI','LM','RG','AU','LC','DM','LA','FD','RT','ES','RC','RE','EE','FS')
    UNION
    (SELECT SAL_MATR
    FROM CCMX.H_ES H
    WHERE TO_DATE('30/12/1899', 'DD/MM/YYYY') + E_S_DATES + 2 <= ('31/12/' || (to_char(sysdate,'yyyy')))
    AND H.MES_IDS IN ('RS','LG','RA','LE','FX','DE','CN','LL','LF','LI','LM','RG','AU','LC','DM','LA','FD','RT','ES','RC','RE','EE','FS')

    ))
    and numrow=1
    GROUP BY
    CS.SAL_MATR
    ,S.SAL_NOSS
    ,(TO_DATE('30/12/1899', 'DD/MM/YYYY') + CS.POT_DU + 2)
    ,decode(categ.CAT_ID,'C',CS.POT_VAL)
    , decode(categ.CAT_ID,'E',CS.POT_VAL)

  15. #15
    Membre expérimenté Avatar de Loyd1974
    Profil pro
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Par défaut
    essayes comme cela:
    (NB: il y'aura surement quelque petit ajustement à faire notamment au niveau du group 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
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    SELECT s.Sal_Noss,
           Cs.Sal_Matr AS Matricule,
           (To_Date('30/12/1899', 'DD/MM/YYYY') + Cs.Pot_Du + 2) AS Appo,
           MAX(Cs.Pot_Val) AS Remu_Theo_Base,
           Decode(First_Value(h.Cat_Id) Over ORDER
                  BY(To_Date('30/12/1899', 'DD/MM/YYYY') + h.Hca_Date + 2 DESC), 'C',
                  Cs.Pot_Val) AS Remu_Theo_Cadre_13,
           Decode(First_Value(h.Cat_Id) Over ORDER
                  BY(To_Date('30/12/1899', 'DD/MM/YYYY') + h.Hca_Date + 2 DESC), 'E',
                  Cs.Pot_Val) AS Remu_Theo_Etam_13,
           '31/12/' || (To_Char(SYSDATE, 'yyyy')) AS Temps_Id
    FROM   Salarie   s,
           Const_Sal Cs,
           h_Categ   h
    WHERE  (To_Date('30/12/1899', 'DD/MM/YYYY') + h.Hca_Date + 2) <=
           To_Date('31/12/' || (To_Char(SYSDATE, 'yyyy')), 'DD/MM/YYYY')
    AND    h.Sal_Matr = s.Sal_Matr
    AND    Cs.Arc_Id = 'APPO'
    AND    s.Sal_Matr = Cs.Sal_Matr
    AND    Cs.Mon_Id = 'EUR'
    AND    (Cs.Pot_Du) =
           (SELECT MAX(Appo.Pot_Du)
             FROM   Const_Sal Appo
             WHERE  Appo.Arc_Id = 'APPO'
             AND    Appo.Mon_Id = 'EUR'
             AND    Appo.Sal_Matr = Cs.Sal_Matr
             AND    (To_Date('30/12/1899', 'DD/MM/YYYY') + Appo.Pot_Du + 2) <=
                    To_Date('31/12/' || (To_Char(SYSDATE, 'yyyy')), 'DD/MM/YYYY'))
    AND    --Cs.Sal_Matr NOT IN
           NOT EXISTS
     (SELECT 1
            FROM   Const_Sal Cs1
            WHERE  Cs.Sal_Matr = Cs1.Sal_Matr
            AND    Cs1.Arc_Id = 'OBAN'
            AND    (To_Date('30/12/1899', 'DD/MM/YYYY') + Pot_Du + 2) <=
                   To_Date('31/12/' || (To_Char(SYSDATE, 'yyyy')), 'DD/MM/YYYY'))
    AND    -- Cs.Sal_Matr NOT IN
           NOT EXISTS
     (SELECT 1
            FROM   Ccmx.h_Es_Sauv Hs
            WHERE  Cs.Sal_Matr = Hs.Sal_Matr
            AND    To_Date('30/12/1899', 'DD/MM/YYYY') + Hs.e_s_Dates + 2 <=
                   ('31/12/' || (To_Char(SYSDATE, 'yyyy')))
            AND    Hs.Mes_Ids IN
                   ('RS', 'LG', 'RA', 'LE', 'FX', 'DE', 'CN', 'LL', 'LF', 'LI', 'LM', 'RG', 'AU', 'LC', 'DM', 'LA', 'FD', 'RT', 'ES', 'RC', 'RE', 'EE', 'FS')
            UNION ALL
            SELECT 1
            FROM   Ccmx.h_Es h
            WHERE  h.Sal_Matr = Cs.Sal_Matr
            AND    To_Date('30/12/1899', 'DD/MM/YYYY') + e_s_Dates + 2 <=
                   ('31/12/' || (To_Char(SYSDATE, 'yyyy')))
            AND    h.Mes_Ids IN
                   ('RS', 'LG', 'RA', 'LE', 'FX', 'DE', 'CN', 'LL', 'LF', 'LI', 'LM', 'RG', 'AU', 'LC', 'DM', 'LA', 'FD', 'RT', 'ES', 'RC', 'RE', 'EE', 'FS'))
    GROUP  BY Cs.Sal_Matr,
              s.Sal_Noss,
              (To_Date('30/12/1899', 'DD/MM/YYYY') + Cs.Pot_Du + 2),
             Decode(First_Value(h.Cat_Id) Over ORDER
                  BY(To_Date('30/12/1899', 'DD/MM/YYYY') + h.Hca_Date + 2 DESC), 'C',
                  Cs.Pot_Val) 
           Decode(First_Value(h.Cat_Id) Over ORDER
                  BY(To_Date('30/12/1899', 'DD/MM/YYYY') + h.Hca_Date + 2 DESC), 'E',
                  Cs.Pot_Val)
    J'ai viré le distinct qui était redondant avec le group by
    J'ai remplacé les NOT IN par des NOT EXISTS généralement plus performant
    J'ai remplacé le UNION par un UNION ALL car il n'y a ici aucun besoin de faire un UNIQUE SORT

  16. #16
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    236
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 236
    Par défaut
    Ok merci pour les corrections...
    Par contre il me renvoie une erreur :

    ORA-30483: fonctions de fenêtrage interdites ici


    Je suis en oracle 9i je ne sais pas si ca change qqchose....

  17. #17
    Membre expérimenté Avatar de Loyd1974
    Profil pro
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Par défaut
    C'est moi qui ait du écrire une bêtise, c'est surement au niveau du group by, il doit pas apprécier d'avoir des fonctions analytiques à l'intérieur.
    Je n'ai jamais testé d'avoir à la fois des fonctions analytiques et des fonctions d'agrégats dans la même requête.

    Essaye de retoucher le group by, si j'ai le temps, j'essayerai de trouver comment on fait

  18. #18
    Membre expérimenté Avatar de Loyd1974
    Profil pro
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Par défaut
    En fait, cela devrait peut être mieux marché ainsi :

    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
    53
    54
    55
    56
    SELECT DISTINCT 
           s.Sal_Noss,
           Cs.Sal_Matr AS Matricule,
           (To_Date('30/12/1899', 'DD/MM/YYYY') + Cs.Pot_Du + 2) AS Appo,
           MAX(Cs.Pot_Val) OVER (PARTITION BY s.Sal_Noss, Cs.Sal_Matr, (To_Date('30/12/1899', 'DD/MM/YYYY') + Cs.Pot_Du + 2)
    ) AS Remu_Theo_Base,
           Decode(First_Value(h.Cat_Id) Over ORDER
                  BY(To_Date('30/12/1899', 'DD/MM/YYYY') + h.Hca_Date + 2 DESC), 'C',
                  Cs.Pot_Val) AS Remu_Theo_Cadre_13,
           Decode(First_Value(h.Cat_Id) Over ORDER
                  BY(To_Date('30/12/1899', 'DD/MM/YYYY') + h.Hca_Date + 2 DESC), 'E',
                  Cs.Pot_Val) AS Remu_Theo_Etam_13,
           '31/12/' || (To_Char(SYSDATE, 'yyyy')) AS Temps_Id
    FROM   Salarie   s,
           Const_Sal Cs,
           h_Categ   h
    WHERE  (To_Date('30/12/1899', 'DD/MM/YYYY') + h.Hca_Date + 2) <=
           To_Date('31/12/' || (To_Char(SYSDATE, 'yyyy')), 'DD/MM/YYYY')
    AND    h.Sal_Matr = s.Sal_Matr
    AND    Cs.Arc_Id = 'APPO'
    AND    s.Sal_Matr = Cs.Sal_Matr
    AND    Cs.Mon_Id = 'EUR'
    AND    (Cs.Pot_Du) =
           (SELECT MAX(Appo.Pot_Du)
             FROM   Const_Sal Appo
             WHERE  Appo.Arc_Id = 'APPO'
             AND    Appo.Mon_Id = 'EUR'
             AND    Appo.Sal_Matr = Cs.Sal_Matr
             AND    (To_Date('30/12/1899', 'DD/MM/YYYY') + Appo.Pot_Du + 2) <=
                    To_Date('31/12/' || (To_Char(SYSDATE, 'yyyy')), 'DD/MM/YYYY'))
    AND    --Cs.Sal_Matr NOT IN
           NOT EXISTS
     (SELECT 1
            FROM   Const_Sal Cs1
            WHERE  Cs.Sal_Matr = Cs1.Sal_Matr
            AND    Cs1.Arc_Id = 'OBAN'
            AND    (To_Date('30/12/1899', 'DD/MM/YYYY') + Pot_Du + 2) <=
                   To_Date('31/12/' || (To_Char(SYSDATE, 'yyyy')), 'DD/MM/YYYY'))
    AND    -- Cs.Sal_Matr NOT IN
           NOT EXISTS
     (SELECT 1
            FROM   Ccmx.h_Es_Sauv Hs
            WHERE  Cs.Sal_Matr = Hs.Sal_Matr
            AND    To_Date('30/12/1899', 'DD/MM/YYYY') + Hs.e_s_Dates + 2 <=
                   ('31/12/' || (To_Char(SYSDATE, 'yyyy')))
            AND    Hs.Mes_Ids IN
                   ('RS', 'LG', 'RA', 'LE', 'FX', 'DE', 'CN', 'LL', 'LF', 'LI', 'LM', 'RG', 'AU', 'LC', 'DM', 'LA', 'FD', 'RT', 'ES', 'RC', 'RE', 'EE', 'FS')
            UNION ALL
            SELECT 1
            FROM   Ccmx.h_Es h
            WHERE  h.Sal_Matr = Cs.Sal_Matr
            AND    To_Date('30/12/1899', 'DD/MM/YYYY') + e_s_Dates + 2 <=
                   ('31/12/' || (To_Char(SYSDATE, 'yyyy')))
            AND    h.Mes_Ids IN
                   ('RS', 'LG', 'RA', 'LE', 'FX', 'DE', 'CN', 'LL', 'LF', 'LI', 'LM', 'RG', 'AU', 'LC', 'DM', 'LA', 'FD', 'RT', 'ES', 'RC', 'RE', 'EE', 'FS'))
    J'ai remplacé la fonction d'agrégat MAX par sa correspondance en analytique et du coup, on passe par un distinct et non par un GROUP BY

    Edit: erreur sur une parenthèse corrigée

  19. #19
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    236
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 236
    Par défaut
    Me voila revenue...
    Quand j'execute cette derniere requete, il me met:
    "ORA-30484: absence de spécification de fenêtre pour cette fonction"

    J'ai essayé de mettre des parentheses au niveau "over(order by....) " mais dans ces cas la j'ai une erreur de parentheses...

  20. #20
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    236
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 236
    Par défaut
    J'ai reussi à resoudre ma requete
    Par contre j'ai un dernier souci (mais j'approche du but).
    Quand je fais ma requete et que je selectionne un matricule, il met la bonne catégorie pour ce matricule. Par contre si je ne met pas de critere sur le matricule (donc j'affiche tous les matricules), il met tout le monde dans la meme catégorie...et donc le decode ne fonctionne pas comme il faut..

    Je pense qu'il faut tout de meme conserver le group by mais je n'arrive pas a le mettre sans erreur..

    Qqn a une idée?

    voici ma super 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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    SELECT distinct
           s.Sal_Noss,
           Cs.Sal_Matr AS Matricule,
           (To_Date('30/12/1899', 'DD/MM/YYYY') + Cs.Pot_Du + 2) AS Appo,
           MAX(Cs.Pot_Val) OVER (PARTITION BY s.Sal_Noss, Cs.Sal_Matr, (To_Date('30/12/1899', 'DD/MM/YYYY') + Cs.Pot_Du + 2)) AS Remu_Theo_Base,
           Decode(FIRST_VALUE(h.Cat_Id) OVER (ORDER BY To_Date('30/12/1899', 'DD/MM/YYYY') + h.Hca_Date + 2 DESC), 'C',Cs.Pot_Val) AS Remu_Theo_Cadre_13
         ,Decode(FIRST_VALUE(h.Cat_Id) OVER (ORDER BY To_Date('30/12/1899', 'DD/MM/YYYY') + h.Hca_Date + 2 DESC), 'E',Cs.Pot_Val) AS Remu_Theo_Etam_13
    ,'31/12/' || (To_Char(SYSDATE, 'yyyy')) AS Temps_Id 
     
     
    FROM   Salarie   s,
           Const_Sal Cs,
           h_Categ   h
    WHERE  (To_Date('30/12/1899', 'DD/MM/YYYY') + h.Hca_Date + 2) <=
           To_Date('31/12/' || (To_Char(SYSDATE, 'yyyy')), 'DD/MM/YYYY')
    AND    h.Sal_Matr = s.Sal_Matr
    AND    Cs.Arc_Id = 'APPO'
    AND    s.Sal_Matr = Cs.Sal_Matr
    AND    Cs.Mon_Id = 'EUR'
    AND    (Cs.Pot_Du) =
           (SELECT MAX(Appo.Pot_Du)
             FROM   Const_Sal Appo
             WHERE  Appo.Arc_Id = 'APPO'
             AND    Appo.Mon_Id = 'EUR'
             AND    Appo.Sal_Matr = Cs.Sal_Matr
             AND    (To_Date('30/12/1899', 'DD/MM/YYYY') + Appo.Pot_Du + 2) <=
                    To_Date('31/12/' || (To_Char(SYSDATE, 'yyyy')), 'DD/MM/YYYY'))
    AND    --Cs.Sal_Matr NOT IN
           NOT EXISTS
     (SELECT 1
            FROM   Const_Sal Cs1
            WHERE  Cs.Sal_Matr = Cs1.Sal_Matr
            AND    Cs1.Arc_Id = 'OBAN'
            AND    (To_Date('30/12/1899', 'DD/MM/YYYY') + Pot_Du + 2) <=
                   To_Date('31/12/' || (To_Char(SYSDATE, 'yyyy')), 'DD/MM/YYYY'))
    AND    -- Cs.Sal_Matr NOT IN
           NOT EXISTS
     (SELECT 1
            FROM   Ccmx.h_Es_Sauv Hs
            WHERE  Cs.Sal_Matr = Hs.Sal_Matr
            AND    To_Date('30/12/1899', 'DD/MM/YYYY') + Hs.e_s_Dates + 2 <=
                   ('31/12/' || (To_Char(SYSDATE, 'yyyy')))
            AND    Hs.Mes_Ids IN
                   ('RS', 'LG', 'RA', 'LE', 'FX', 'DE', 'CN', 'LL', 'LF', 'LI', 'LM', 'RG', 'AU', 'LC', 'DM', 'LA', 'FD', 'RT', 'ES', 'RC', 'RE', 'EE', 'FS')
            UNION ALL
            SELECT 1
            FROM   Ccmx.h_Es h
            WHERE  h.Sal_Matr = Cs.Sal_Matr
            AND    To_Date('30/12/1899', 'DD/MM/YYYY') + e_s_Dates + 2 <=
                   ('31/12/' || (To_Char(SYSDATE, 'yyyy')))
            AND    h.Mes_Ids IN
                   ('RS', 'LG', 'RA', 'LE', 'FX', 'DE', 'CN', 'LL', 'LF', 'LI', 'LM', 'RG', 'AU', 'LC', 'DM', 'LA', 'FD', 'RT', 'ES', 'RC', 'RE', 'EE', 'FS'))
    En fait, j'aimerais avoir une valeur pour chaque cs.sal_matr ou sal_noss

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

Discussions similaires

  1. Requetes paramétrés avec Date et BETWEEN
    Par mehdi_scofield dans le forum ASP.NET
    Réponses: 3
    Dernier message: 06/11/2008, 14h05
  2. Requete SQL avec date !
    Par sab_etudianteBTS dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 21/02/2007, 21h49
  3. [C# et Asp.net] requete SQL avec date
    Par misscricri dans le forum Accès aux données
    Réponses: 4
    Dernier message: 20/02/2007, 16h31
  4. requete select avec date
    Par druglord dans le forum Requêtes
    Réponses: 9
    Dernier message: 07/08/2006, 10h47
  5. [SQL] Requete sql avec dates
    Par SergeF dans le forum Langage SQL
    Réponses: 5
    Dernier message: 11/03/2006, 16h53

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