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 avec jointure bases


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 avec jointure bases
    Bonjour,
    Mon objectif: compter les jours ouvrés entre 2 dates.
    J'ai une table TEMPS qui contient des dates et qui marque à '1' les jours fériés, samedi et dimanche.

    TEMPS_ID FERIE
    01/11/2005 1
    02/11/2005 0
    03/11/2005 0
    04/11/2005 0
    05/11/2005 0
    06/11/2005 0
    07/11/2005 0
    08/11/2005 0
    09/11/2005 0
    10/11/2005 0
    11/11/2005 1



    J'ai une autre table des absences dans lequel j'ai une date début et fin.

    ABSENCE_ID TEMPS_ID TEMPS_ID_FIN
    3 01/11/2005 11/11/2005


    Quand je fais un test seulement sur la table TEMPS du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT COUNT(TEMPS_ID)
    FROM DRH_TEMPS
    WHERE FERIE IS NULL 
    AND TEMPS_ID BETWEEN '01/11/2005' AND '11/11/2005'
    ca me renvoit bien : 7.

    Par contre dès que j'essaye de faire la jointure avec la table des absences...ca ne fonctionne plus...
    Une idée?
    Merci

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par steinia Voir le message
    Par contre dès que j'essaye de faire la jointure avec la table des absences...ca ne fonctionne plus...
    C'est à dire ?
    On peut voir la tête de ta jointure ?

  3. #3
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    236
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 236
    Par défaut
    Du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT 
    COUNT(T.TEMPS_ID)
    FROM DRH_TEMPS T, FRH F
    WHERE FERIE IS NULL 
    AND F.ABSENCE_ID=3
    AND F.TEMPS_ID BETWEEN F.TEMPS_ID AND TEMPS_ID_FIN

  4. #4
    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
    Citation Envoyé par steinia Voir le message
    Du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT 
    COUNT(T.TEMPS_ID)
    FROM DRH_TEMPS T, FRH F
    WHERE FERIE IS NULL 
    AND F.ABSENCE_ID=3
    AND F.TEMPS_ID BETWEEN F.TEMPS_ID AND TEMPS_ID_FIN
    ok, tu as répondu entre temps. Juste un truc, entre l'exemple que tu nous donne et le code, tu es sûr que FERIE est NULL et qu'il ne faut pas faire plutôt un NVL(FERIE,0) = 0 ?

  5. #5
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    236
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 236
    Par défaut
    Non ca me renvoit tjs 0....pour cette requete.

    Un peu plus d'explication:

    Lorsque je fais 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
    SELECT
    SALARIE_ID
    ,FRH.TEMPS_ID
    , COUNT(T.TEMPS_ID) as DUREE
    FROM FRH, SALARIE, DRH_TEMPS T
    WHERE EVENEMENT_ID='9'
    AND FRH.ABSENCE_ID='3'
    AND FRH.TEMPS_ID = T.TEMPS_ID
    AND FRH.SALARIE_ID=SALARIE.SAL_ID
    AND MATRICULE='190674'
    AND NVL(FERIE,0)=0
     AND T.TEMPS_ID BETWEEN FRH.TEMPS_ID AND FRH.TEMPS_ID_FIN 
    GROUP BY  FRH.TEMPS_ID
    , SALARIE_ID
    J'obtiens :

    SALARIE_ID TEMPS_ID DUREE
    1948 2005/01/18 00:00:00.000 1
    1948 2005/02/14 00:00:00.000 1
    1948 2005/08/30 00:00:00.000 1
    ALors que je devrais obtenir:
    TEMPS_ID TEMPS_ID_FIN DUREE
    2005/01/18 00:00:00.000 2005/01/29 00:00:00.000 9
    2005/01/30 00:00:00.000 2005/02/13 00:00:00.000 10
    2005/02/14 00:00:00.000 2005/02/26 00:00:00.000 10
    2005/02/27 00:00:00.000 2005/03/12 00:00:00.000 10
    2005/08/30 00:00:00.000 2005/09/18 00:00:00.000 14

  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
    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
     
    create table temps as (
    select date '2005-11-01' temps_id, 1 ferie from dual union all
    select date '2005-11-02', 0 from dual union all
    select date '2005-11-03', 0 from dual union all
    select date '2005-11-04', 0 from dual union all
    select date '2005-11-05', 0 from dual union all
    select date '2005-11-06', 0 from dual union all
    select date '2005-11-07', 0 from dual union all
    select date '2005-11-08', 0 from dual union all
    select date '2005-11-09', 0 from dual union all
    select date '2005-11-10', 0 from dual union all
    select date '2005-11-11', 1 from dual union all
    select date '2005-10-30', 1 from dual union all
    select date '2005-11-12', 0 from dual);
    create table absence as (select 3 absence_id, date '2005-11-01' 
    temps_id, date '2005-11-11' temps_id_fin from dual );
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select
      absence.absence_id,
      absence.temps_id,
      absence.temps_id_fin,
      absence.temps_id_fin-absence.temps_id-sum(temps.ferie)+1 duree
    from absence,temps
    where temps.temps_id between absence.temps_id and absence.temps_id_fin
    group by absence.absence_id, absence.temps_id, absence.temps_id_fin;
     
    ABSENCE_ID TEMPS_ID        TEMPS_ID_FIN         DUREE
    ---------- --------------- --------------- ----------
             3 TUE 01/11 00:00 FRI 11/11 00:00          9

  7. #7
    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
    Tu devrais peut être expliqué plus clairement ce que tu veux obtenir parce que je ne comprends pas quand tu dis que lorsque tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT
    SALARIE_ID
    ,FRH.TEMPS_ID
    , COUNT(T.TEMPS_ID) as DUREE
    FROM ...
    Tu "devrais" obtenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TEMPS_ID TEMPS_ID_FIN  DUREE
    Les champs ne sont pas les mêmes. Ou bien tu as confondu "devrais" avec "voudrais" et dans ce cas, il faut réécrire la requête

  8. #8
    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
    tu dois vouloir faire quelque chose du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT a.absence_id, COUNT(t.temp_id)
    FROM temps t, absence a    
    WHERE a.absence_id = 3
    AND t.temp_id BETWEEN a.temps_id AND a.temps_id_fin
    AND (t.ferie IS NULL OR t.ferie = 0)
    ce qui au vu de ton modèle de données permet de savoir à combien de jours ouvrés correspond l'absence

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 23/04/2015, 16h56
  2. Réponses: 3
    Dernier message: 04/06/2009, 15h49
  3. Calcul avec un base Paradox et courant
    Par BXDSPORT dans le forum Bases de données
    Réponses: 5
    Dernier message: 19/12/2007, 09h48
  4. EJB QL jointure avec 2 bases?
    Par chakala dans le forum JPA
    Réponses: 5
    Dernier message: 10/04/2007, 17h02
  5. [ODBC] Pb de requète avec jointure sur 2 bases
    Par Invité dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 12/12/2006, 16h46

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