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 :

Agrégation de deux tables


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 19
    Points : 12
    Points
    12
    Par défaut Agrégation de deux tables
    Bonjour

    Je fais face à un petit problème de jointure de 2 tables pour mon projet de gestion du personnel.
    Chaque personnel travaille à un taux horaire qui peut varier dans l'année.
    Chaque personnel peut être affecté à un poste donné.
    Ces 2 tables, marquées par des dates de début et de fin sont indépendantes. Un personnel peut change de poste sans modifier son taux horaire et inversement.


    Voici les 2 tables :
    Affectation
    Poste
    Date debut Date fin
    Caisse 10/01/2014 02/02/2014
    Stock 03/02/2014 03/03/2014
    SAV 04/03/2014 01/09/2014
    Livreurs 02/09/2014 NULL


    Taux horaire
    Taux
    Date debut Date fin
    50 01/01/2014 01/04/2014
    80 02/04/2014 01/08/2014
    90 02/08/2014 NULL


    Au final, je veux une table qui contiennent l'historique de ce personnel avec tous les événvements de changement de taux horaire ou d'affectation à un poste.
    Le résultat est donc :
    HISTORIQUE
    Taux
    Affectation Date debut Date fin
    Caisse 50 10/01/2014 02/02/2014
    Stock 50 03/02/2014 03/03/2014
    SAV 50 04/03/2014 01/04/2014
    SAV 80 02/04/2014 01/08/2014
    SAV 90 02/08/2014 01/09/2014
    Accueil Livreurs 90 02/09/2014 NULL

    Idéalement, j'obtiens cette table en une seule requête SQL sans modifier mon modèle de données, ni coder.
    Le problème est qu'il y un nombre important de combinaisons et que je ne parviens pas à faire la requête de manière globale.

    Auriez-vous une idée ?
    Merci
    Sylvain

  2. #2
    Membre expérimenté Avatar de ojo77
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2010
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 680
    Points : 1 597
    Points
    1 597
    Par défaut
    Avec le jeu d'essais que vous donnez :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    create table poste as ( 
        select 'Caisse'   Poste, to_date('10/01/2014', 'DD/MM/YYYY') deb, to_date('02/02/2014', 'DD/MM/YYYY') fin from dual
    union all
        select 'Stock'    Poste, to_date('03/02/2014', 'DD/MM/YYYY') deb, to_date('03/03/2014', 'DD/MM/YYYY') fin from dual
    union all
        select 'SAV'      Poste, to_date('04/03/2014', 'DD/MM/YYYY') deb, to_date('01/09/2014', 'DD/MM/YYYY') fin from dual
    union all
        select 'Livreurs' Poste, to_date('02/09/2014', 'DD/MM/YYYY') deb, null                                fin from dual );
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    create table taux as (
        select 50 Taux, to_date('01/01/2014', 'DD/MM/YYYY') deb, to_date('01/04/2014', 'DD/MM/YYYY') fin from dual
    union all
        select 80 Taux, to_date('02/04/2014', 'DD/MM/YYYY') deb, to_date('01/08/2014', 'DD/MM/YYYY') fin from dual
    union all
        select 90 Taux, to_date('02/08/2014', 'DD/MM/YYYY') deb, null                                fin from dual ) ;
    La requête suivante devrait répondre à vos attentes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select p.poste
         , t.taux
         , greatest(t.deb, p.deb) deb
         , least(nvl(t.fin, sysdate ), nvl(p.fin,sysdate) ) fin
    from taux t, poste p
    where greatest(t.deb, p.deb) <  least(nvl(t.fin, sysdate ), nvl(p.fin,sysdate) )
    order by  3 ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    POSTE          TAUX DEB      FIN
    -------- ---------- -------- --------
    Caisse           50 10/01/14 02/02/14
    Stock            50 03/02/14 03/03/14
    SAV              50 04/03/14 01/04/14
    SAV              80 02/04/14 01/08/14
    SAV              90 02/08/14 01/09/14
    Livreurs         90 02/09/14 08/09/14

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 19
    Points : 12
    Points
    12
    Par défaut
    Bonjour

    Je vous remercie pour votre aide
    Je l'ai de mon cote pour un personnel donné (id=6), et voici le résultat.

    Affectation. ID_personnel = 6
    Poste
    Date_debut Date_fin
    Caisse 14/04/14 NULL
    Stock 01/02/12 14/11/12
    SAV 02/01/11 31/01/12
    Livreurs 01/12/10 01/01/11


    Taux horaire
    Taux Dtedeb Dtefin
    90 01/09/14 NULL
    80 01/01/04 31/08/14


    La requete, adaptée est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT t.id_personnel
         ,p.poste
         , t.taux
         , greatest(t.dtedeb, p.date_debut) deb
         , least(nvl(t.dtefin, sysdate ), nvl(p.date_fin,sysdate) ) fin
    FROM taux t, poste p
    WHERE (greatest(t.dtedeb, p.date_debut) <  least(nvl(t.dtefin, sysdate ), nvl(p.date_fin,sysdate) )) and t.id_personnel = 6;

    Le résultat en sortie est :
    ID_personne
    Poste Taux date_debut date_fin
    6 167 90 08/09/14 09/09/14
    6 167 90 08/09/14 09/09/14
    6 480 90 08/09/14 09/09/14
    6 298 90 08/09/14 09/09/14




    Les résultats ne correspondent pas du tout (j'ai laisse les codes numériques pour le poste).

    J'ai alors mis une jointure.
    Les résultats sont plus cohérents, mais pas encore bien juste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT 
    t.id_personnel
    ,p.poste
         , t.CODREG
         , greatest(t.dtedeb, p.date_debut) deb
         , least(nvl(t.dtefin, sysdate ), nvl(p.date_fin,sysdate) ) fin
    FROM  poste p
    JOIN taux t ON t.id_personnel= p.id_personnel AND
     (greatest(t.dtedeb, p.date_debut) <  least(nvl(t.dtefin, sysdate ), nvl(p.date_fin,sysdate) )) 
     WHERE t.id_personnel= 6 and t.taux not null
    ORDER BY  deb DESC ;

    Résultats :
    ID_personne
    Poste Taux date_debut date_fin
    6 Caisse 90 01/09/14 09/09/14
    6 128037 90 01/09/14 09/09/14
    6 6662 90 01/09/14 09/09/14
    6 6661 90 01/09/14 09/09/14
    6 6660 90 01/09/14 09/09/14
    6 86975 90 01/09/14 09/09/14
    6 Caisse 90 14/04/14 31/08/14
    6 128037 90 14/04/14 31/08/14
    6 116430 90 15/05/13 13/04/14
    6 111139 90 15/11/12 14/05/13
    6 Stock 80 01/02/12 14/11/12
    6 SAV 80 02/01/11 31/01/12
    6 86975 80 02/01/11 31/08/14
    6 Livreurs 80 01/12/10 01/01/11
    6 71886 80 01/01/10 30/11/10
    6 70129 80 01/07/09 31/12/09
    6 61747 80 01/07/08 30/06/09
    6 58312 80 01/10/07 30/06/08
    6 56707 80 01/01/07 30/09/07
    6 37858 80 01/10/06 31/12/06
    6 43640 80 01/11/05 30/09/06
    6 37415 80 01/05/05 31/10/05
    6 28236 80 01/11/04 01/11/04
    6 6661 80 01/01/04 31/08/14
    6 46155 80 01/01/04 30/04/05
    6 6662 80 01/01/04 31/08/14
    6 21403 80 01/01/04 31/10/04
    6 6660 80 01/01/04 31/08/14



    Moins de résultats, mais les dates ne correspondent pas, à part pour la première ligne.

  4. #4
    Membre expérimenté Avatar de ojo77
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2010
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 680
    Points : 1 597
    Points
    1 597
    Par défaut
    Soyons rigoureux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE TABLE poste AS ( 
        SELECT 6 idp, 'Caisse'   Poste, to_date('10/01/2014', 'DD/MM/YYYY') deb, to_date('02/02/2014', 'DD/MM/YYYY') fin FROM dual union ALL 
        SELECT 6 idp, 'Stock'    Poste, to_date('03/02/2014', 'DD/MM/YYYY') deb, to_date('03/03/2014', 'DD/MM/YYYY') fin FROM dual union ALL 
        SELECT 6 idp, 'SAV'      Poste, to_date('04/03/2014', 'DD/MM/YYYY') deb, to_date('01/09/2014', 'DD/MM/YYYY') fin FROM dual union ALL 
        SELECT 7 idp, 'Caisse'   Poste, to_date('10/01/2014', 'DD/MM/YYYY') deb, to_date('02/02/2014', 'DD/MM/YYYY') fin FROM dual union ALL 
        SELECT 7 idp, 'Stock'    Poste, to_date('03/02/2014', 'DD/MM/YYYY') deb, to_date('03/03/2014', 'DD/MM/YYYY') fin FROM dual union ALL 
        SELECT 7 idp, 'SAV'      Poste, to_date('04/03/2014', 'DD/MM/YYYY') deb, to_date('01/09/2014', 'DD/MM/YYYY') fin FROM dual union ALL 
        SELECT 8 idp, 'Caisse'   Poste, to_date('10/01/2014', 'DD/MM/YYYY') deb, to_date('02/02/2014', 'DD/MM/YYYY') fin FROM dual union ALL 
        SELECT 8 idp, 'Stock'    Poste, to_date('03/02/2014', 'DD/MM/YYYY') deb, to_date('03/03/2014', 'DD/MM/YYYY') fin FROM dual union ALL 
        SELECT 8 idp, 'SAV'      Poste, to_date('04/03/2014', 'DD/MM/YYYY') deb, to_date('01/09/2014', 'DD/MM/YYYY') fin FROM dual union ALL 
        SELECT 6 idp, 'Livreurs' Poste, to_date('02/09/2014', 'DD/MM/YYYY') deb, NULL                                fin FROM dual );
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TABLE taux AS (
        SELECT 6 idp, 50 Taux, to_date('01/01/2014', 'DD/MM/YYYY') deb, to_date('01/04/2014', 'DD/MM/YYYY') fin FROM dual union ALL
        SELECT 6 idp, 80 Taux, to_date('02/04/2014', 'DD/MM/YYYY') deb, to_date('01/08/2014', 'DD/MM/YYYY') fin FROM dual union ALL
        SELECT 6 idp, 90 Taux, to_date('02/08/2014', 'DD/MM/YYYY') deb, NULL                                fin FROM dual union ALL
        SELECT 7 idp, 50 Taux, to_date('01/01/2014', 'DD/MM/YYYY') deb, to_date('01/04/2014', 'DD/MM/YYYY') fin FROM dual union ALL
        SELECT 7 idp, 80 Taux, to_date('02/04/2014', 'DD/MM/YYYY') deb, to_date('01/08/2014', 'DD/MM/YYYY') fin FROM dual union ALL
        SELECT 7 idp, 90 Taux, to_date('02/08/2014', 'DD/MM/YYYY') deb, NULL                                fin FROM dual union ALL
        SELECT 8 idp, 50 Taux, to_date('01/01/2014', 'DD/MM/YYYY') deb, to_date('01/04/2014', 'DD/MM/YYYY') fin FROM dual union ALL
        SELECT 8 idp, 80 Taux, to_date('02/04/2014', 'DD/MM/YYYY') deb, to_date('01/08/2014', 'DD/MM/YYYY') fin FROM dual union ALL
        SELECT 8 idp, 90 Taux, to_date('02/08/2014', 'DD/MM/YYYY') deb, NULL                                fin FROM dual ) ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT p.poste
         , t.taux
         , greatest(t.deb, p.deb) deb
         , least(nvl(t.fin, sysdate ), nvl(p.fin,sysdate) ) fin
    FROM taux t inner join poste p on t.idp=p.idp
    WHERE greatest(t.deb, p.deb) <  least(nvl(t.fin, sysdate ), nvl(p.fin,sysdate) )
      AND t.IDP=6
      AND p.IDP=6
    ORDER BY  3 ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    POSTE          TAUX DEB      FIN
    -------- ---------- -------- --------
    Caisse           50 10/01/14 02/02/14
    Stock            50 03/02/14 03/03/14
    SAV              50 04/03/14 01/04/14
    SAV              80 02/04/14 01/08/14
    SAV              90 02/08/14 01/09/14
    Livreurs         90 02/09/14 09/09/14

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Comme ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT 
        P.Poste
        ,T.Taux
        ,CASE WHEN T.Deb < P.Deb THEN P.Deb ELSE COALESCE(T.Deb, P.Deb) END AS Debut
        ,CASE WHEN T.Fin > P.Fin THEN P.Fin ELSE COALESCE(T.Fin, P.Fin) END AS Fin
    FROM Poste P
    INNER JOIN Taux T
      ON  (T.deb < P.fin OR P.fin IS NULL) 
      AND (T.fin >= P.Deb OR T.fin IS NULL )

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 19
    Points : 12
    Points
    12
    Par défaut
    Pour Ojo, je trouve encore des resultats zarbes.

    Voici les dumps
    Taux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Insert into Taux (Taux,id_personnel,DTEDEB,DTEFIN) values ('80','6',to_date('01/01/04 00:00:00','DD/MM/YY HH24:MI:SS'),to_date('31/08/14 00:00:00','DD/MM/YY HH24:MI:SS'))
    Insert into Taux (Taux,id_personnel,DTEDEB,DTEFIN) values ('90','6',to_date('01/09/14 00:00:00','DD/MM/YY HH24:MI:SS'),null)
    Poste :
    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
     
    Insert into "Poste" (Poste,DATE_DEBUT,DATE_FIN) values ('Caisse',to_date('14/04/14 00:00:00','DD/MM/YY HH24:MI:SS'),null)
    Insert into "Poste" (Poste,DATE_DEBUT,DATE_FIN) values ('128037',to_date('14/04/14 00:00:00','DD/MM/YY HH24:MI:SS'),null)
    Insert into "Poste" (Poste,DATE_DEBUT,DATE_FIN) values ('116430',to_date('15/05/13 00:00:00','DD/MM/YY HH24:MI:SS'),to_date('13/04/14 23:59:59','DD/MM/YY HH24:MI:SS'))
    Insert into "Poste" (Poste,DATE_DEBUT,DATE_FIN) values ('111139',to_date('15/11/12 00:00:00','DD/MM/YY HH24:MI:SS'),to_date('14/05/13 23:59:59','DD/MM/YY HH24:MI:SS'))
    Insert into "Poste" (Poste,DATE_DEBUT,DATE_FIN) values ('Stock',to_date('01/02/12 00:00:00','DD/MM/YY HH24:MI:SS'),to_date('14/11/12 23:59:59','DD/MM/YY HH24:MI:SS'))
    Insert into "Poste" (Poste,DATE_DEBUT,DATE_FIN) values ('SAV',to_date('02/01/11 00:00:00','DD/MM/YY HH24:MI:SS'),to_date('31/01/12 23:59:59','DD/MM/YY HH24:MI:SS'))
    Insert into "Poste" (Poste,DATE_DEBUT,DATE_FIN) values ('86975',to_date('02/01/11 00:00:00','DD/MM/YY HH24:MI:SS'),null)
    Insert into "Poste" (Poste,DATE_DEBUT,DATE_FIN) values ('Livreurs',to_date('01/12/10 00:00:00','DD/MM/YY HH24:MI:SS'),to_date('01/01/11 23:59:59','DD/MM/YY HH24:MI:SS'))
    Insert into "Poste" (Poste,DATE_DEBUT,DATE_FIN) values ('71886',to_date('01/01/10 00:00:00','DD/MM/YY HH24:MI:SS'),to_date('30/11/10 23:59:59','DD/MM/YY HH24:MI:SS'))
    Insert into "Poste" (Poste,DATE_DEBUT,DATE_FIN) values ('70129',to_date('01/07/09 00:00:00','DD/MM/YY HH24:MI:SS'),to_date('31/12/09 23:59:59','DD/MM/YY HH24:MI:SS'))
    Insert into "Poste" (Poste,DATE_DEBUT,DATE_FIN) values ('61747',to_date('01/07/08 00:00:00','DD/MM/YY HH24:MI:SS'),to_date('30/06/09 23:59:59','DD/MM/YY HH24:MI:SS'))
    Insert into "Poste" (Poste,DATE_DEBUT,DATE_FIN) values ('58312',to_date('01/10/07 00:00:00','DD/MM/YY HH24:MI:SS'),to_date('30/06/08 23:59:59','DD/MM/YY HH24:MI:SS'))
    Insert into "Poste" (Poste,DATE_DEBUT,DATE_FIN) values ('56707',to_date('01/01/07 00:00:00','DD/MM/YY HH24:MI:SS'),to_date('30/09/07 23:59:59','DD/MM/YY HH24:MI:SS'))
    Insert into "Poste" (Poste,DATE_DEBUT,DATE_FIN) values ('37858',to_date('01/10/06 00:00:00','DD/MM/YY HH24:MI:SS'),to_date('31/12/06 23:59:59','DD/MM/YY HH24:MI:SS'))
    Insert into "Poste" (Poste,DATE_DEBUT,DATE_FIN) values ('43640',to_date('01/11/05 00:00:00','DD/MM/YY HH24:MI:SS'),to_date('30/09/06 23:59:59','DD/MM/YY HH24:MI:SS'))
    Insert into "Poste" (Poste,DATE_DEBUT,DATE_FIN) values ('37415',to_date('01/05/05 00:00:00','DD/MM/YY HH24:MI:SS'),to_date('31/10/05 23:59:59','DD/MM/YY HH24:MI:SS'))
    Insert into "Poste" (Poste,DATE_DEBUT,DATE_FIN) values ('28236',to_date('01/11/04 00:00:00','DD/MM/YY HH24:MI:SS'),to_date('01/11/04 23:59:59','DD/MM/YY HH24:MI:SS'))
    Insert into "Poste" (Poste,DATE_DEBUT,DATE_FIN) values ('46155',to_date('01/01/04 00:00:00','DD/MM/YY HH24:MI:SS'),to_date('30/04/05 23:59:59','DD/MM/YY HH24:MI:SS'))
    Insert into "Poste" (Poste,DATE_DEBUT,DATE_FIN) values ('1097',to_date('01/08/03 00:00:00','DD/MM/YY HH24:MI:SS'),to_date('31/12/03 23:59:59','DD/MM/YY HH24:MI:SS'))
    Insert into "Poste" (Poste,DATE_DEBUT,DATE_FIN) values ('1270',to_date('01/01/01 00:00:00','DD/MM/YY HH24:MI:SS'),to_date('31/07/03 23:59:59','DD/MM/YY HH24:MI:SS'))
    Insert into "Poste" (Poste,DATE_DEBUT,DATE_FIN) values ('17431',to_date('01/01/00 00:00:00','DD/MM/YY HH24:MI:SS'),to_date('31/12/00 23:59:59','DD/MM/YY HH24:MI:SS'))
    Insert into "Poste" (Poste,DATE_DEBUT,DATE_FIN) values ('21403',to_date('01/11/96 00:00:00','DD/MM/YY HH24:MI:SS'),to_date('31/10/04 23:59:59','DD/MM/YY HH24:MI:SS'))
    Insert into "Poste" (Poste,DATE_DEBUT,DATE_FIN) values ('6661',to_date('01/01/93 00:00:00','DD/MM/YY HH24:MI:SS'),to_date('31/12/99 23:59:59','DD/MM/YY HH24:MI:SS'))
    Insert into "Poste" (Poste,DATE_DEBUT,DATE_FIN) values ('6660',to_date('01/10/92 00:00:00','DD/MM/YY HH24:MI:SS'),to_date('31/12/92 23:59:59','DD/MM/YY HH24:MI:SS'))
    Insert into "Poste" (Poste,DATE_DEBUT,DATE_FIN) values ('6662',to_date('01/10/91 00:00:00','DD/MM/YY HH24:MI:SS'),to_date('30/09/92 23:59:59','DD/MM/YY HH24:MI:SS'))
    Resultats :
    Poste
    taux date debut
    Caisse 90 01/09/14 09/09/14
    6661 90 01/09/14 09/09/14
    6662 90 01/09/14 09/09/14
    128037 90 01/09/14 09/09/14
    86975 90 01/09/14 09/09/14
    6660 90 01/09/14 09/09/14
    Caisse 80 14/04/14 31/08/14
    128037 80 14/04/14 31/08/14
    116430 80 15/05/13 13/04/14
    111139 80 15/11/12 14/05/13
    Stock 80 01/02/12 14/11/12
    SAV 80 02/01/11 31/01/12
    86975 80 02/01/11 31/08/14
    Livreurs 80 01/12/10 01/01/11
    71886 80 01/01/10 30/11/10
    70129 80 01/07/09 31/12/09
    61747 80 01/07/08 30/06/09
    58312 80 01/10/07 30/06/08
    56707 80 01/01/07 30/09/07
    37858 80 01/10/06 31/12/06
    43640 80 01/11/05 30/09/06
    37415 80 01/05/05 31/10/05
    28236 80 01/11/04 01/11/04
    21403 80 01/01/04 31/10/04
    46155 80 01/01/04 30/04/05
    6662 80 01/01/04 31/08/14
    6661 80 01/01/04 31/08/14
    6660 80 01/01/04 31/08/14

    Entre autres, le taux a 90 ne devrait concerner que la Caisse.
    La Caisse est bien marquée à 90 et 80.

    On ne devrait avoir que la caisse à 90.

  7. #7
    Membre expérimenté Avatar de ojo77
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2010
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 680
    Points : 1 597
    Points
    1 597
    Par défaut
    Après une lecture rapide et sans tests j'en arrive à la conclusion suivante :
    le champs id_personnel ne dépend pas du taux, ni du poste. Il doit s'agir d'une FK. le champ doit apparaitre dans les DEUX tables et être utilisé pour les joindre sinon il y a un souci de modélisation

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 19
    Points : 12
    Points
    12
    Par défaut
    Pour aieuuuuuuu

    Voici le résultat :
    Poste
    TAUX DEBUT FIN
    128037 90 01/09/14 00:00:00
    Caisse 90 01/09/14 00:00:00
    6660 90 01/09/14 00:00:00 31/12/92 23:59:59
    86975 90 01/09/14 00:00:00
    6661 90 01/09/14 00:00:00 31/12/99 23:59:59
    6662 90 01/09/14 00:00:00 30/09/92 23:59:59
    128037 80 14/04/14 00:00:00 31/08/14 00:00:00
    Caisse 80 14/04/14 00:00:00 31/08/14 00:00:00
    116430 80 15/05/13 00:00:00 13/04/14 23:59:59
    111139 80 15/11/12 00:00:00 14/05/13 23:59:59
    Stock 80 01/02/12 00:00:00 14/11/12 23:59:59
    SAV 80 02/01/11 00:00:00 31/01/12 23:59:59
    86975 80 02/01/11 00:00:00 31/08/14 00:00:00
    Livreurs 80 01/12/10 00:00:00 01/01/11 23:59:59
    71886 80 01/01/10 00:00:00 30/11/10 23:59:59
    70129 80 01/07/09 00:00:00 31/12/09 23:59:59
    61747 80 01/07/08 00:00:00 30/06/09 23:59:59
    58312 80 01/10/07 00:00:00 30/06/08 23:59:59
    56707 80 01/01/07 00:00:00 30/09/07 23:59:59
    37858 80 01/10/06 00:00:00 31/12/06 23:59:59
    43640 80 01/11/05 00:00:00 30/09/06 23:59:59
    37415 80 01/05/05 00:00:00 31/10/05 23:59:59
    28236 80 01/11/04 00:00:00 01/11/04 23:59:59
    21403 80 01/01/04 00:00:00 31/10/04 23:59:59
    6660 80 01/01/04 00:00:00 31/08/14 00:00:00
    6661 80 01/01/04 00:00:00 31/08/14 00:00:00
    6662 80 01/01/04 00:00:00 31/08/14 00:00:00
    46155 80 01/01/04 00:00:00 30/04/05 23:59:59

    Le problème vient du fait que le 90 s'attribue sur chacun des postes, alors qu'un seul est concerné.

    Pour Ojo : c'est peut-etre qui explique pourquoi on se casse les dents dessus ....

  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
    Citation Envoyé par laserator Voir le message
    Entre autres, le taux a 90 ne devrait concerner que la Caisse.
    La Caisse est bien marquée à 90 et 80.

    On ne devrait avoir que la caisse à 90.
    Compte-tenu de l'exemple que vous donnez, ça me paraît logique que la caisse sorte sur les deux taux.
    Caisse à partir du 14 avril 2014.
    Taux 80 du 1er janvier 2004 au 31 août 2014
    Taux 90 à partir du 1er septembre 2014.

    Pourquoi ne devrait elle sortir que sur le taux à 90 selon vous ?

    PS : pour formater vos résultats, préférez une sortie texte et utilisez la balise PRE, c'est plus compact et plus simple de suivre.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 19
    Points : 12
    Points
    12
    Par défaut
    Bonjour

    C'est moi qui ai fait la boulette. Effectivement, Caisse doit ressortir aux 2 taux.

    C'est entendu pour le formatage


    Par contre, j'ai trouvé un bug lié au format de date. En effet, les années sont sur 2 digits. Or, certains personnels ont des situations qui datent d'avant l'an 2.000 ....
    Donc, quand il y a des tests comme 01/06/14 < 31/12/92, Oracle le considère comme vrai ,alors que 2014 > 1992 ....
    Esxiste-t-il une méthode propre dans la requête pour ajuster correctement les dates ?

  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
    Si les données sont stockées dans une colonne de type date, le seul problème que vous avez c'est l'affichage de vos colonnes que vous pouvez contrôler au niveau de la session, de votre outil.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
    Si les données sont stockées dans une colonne de type varchar2, il faut faire des conversions et là vous devez utiliser le format RR au lieu de YY :
    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
    with SR as
    (
    select '01/01/70' as col from dual union all
    select '01/01/80'        from dual union all
    select '01/01/90'        from dual union all
    select '01/01/00'        from dual union all
    select '01/01/10'        from dual union all
    select '01/01/20'        from dual
    )
    select col
         , to_date(col, 'dd/mm/yy') as col_yy
         , to_date(col, 'dd/mm/rr') as col_rr
      from SR;
     
    COL      COL_YY     COL_RR   
    -------- ---------- ----------
    01/01/70 2070-01-01 1970-01-01 
    01/01/80 2080-01-01 1980-01-01 
    01/01/90 2090-01-01 1990-01-01 
    01/01/00 2000-01-01 2000-01-01 
    01/01/10 2010-01-01 2010-01-01 
    01/01/20 2020-01-01 2020-01-01

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 19
    Points : 12
    Points
    12
    Par défaut
    J'aurais préféré ne pas toucher au format de la colonne (je n'ai pas la main l'ensemble des applications utilisant les tables et les effets de bord ne sont pas négligeables).
    Mes colonnes sont au format 'DATE'.

    Idéalement, c'est dans la requete que je peux faire la conversion.
    Sinon, il est vrai que modifier le format de le colonne est la meilleure solution propre, mais les risques sont trop grands

  13. #13
    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
    Vous m'avez lu un peu vite, si vos données sont dans une colonne au format date, vous n'avez rien à faire.
    Le format date porte toutes les informations nécessaires, c'est une simple question de représentation de la données sur vos outils.

    Mais dans la mécanique interne du SGBD, tout va bien.

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 19
    Points : 12
    Points
    12
    Par défaut
    En effet, désolé, j'ai lu trop vite...
    La question que je me pose, dans le cadre de ce format de date par exemple "10/02/98" est : l’interprète-t-il comme 1998 ? ou 2098 ?

  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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER session SET nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
    Puis relancez votre requête, vous verrez l'année sur quatre chiffres.

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 19
    Points : 12
    Points
    12
    Par défaut

    Ca fonctionne impeccablement bien j'ai tous les résultats souhaités

    je vais faire un peu le gourmand.
    Est-il possible de rajouter les postes pour lesquels il n'y a pas de taux horaires (=NULL) ?
    Si vous voulez des cas de tests, je vous les fournis

Discussions similaires

  1. Réponses: 17
    Dernier message: 16/03/2012, 10h42
  2. comment lier deux tables?????
    Par baboune dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 16/03/2004, 14h45
  3. [Débutant] Union de deux tables
    Par nyarla01 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 05/03/2004, 10h40
  4. 2 Count() sur deux tables en jointures gauches
    Par Alexandre T dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/09/2003, 16h53
  5. regrouper deux tables
    Par Shabata dans le forum Langage SQL
    Réponses: 4
    Dernier message: 19/05/2003, 15h02

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