Joindre de table avec des interval de dates diffrentes

Résolu
bireumdione Messages postés 13 Date d'inscription samedi 19 août 2006 Statut Membre Dernière intervention 11 novembre 2020 - Modifié le 6 nov. 2020 à 17:37
bireumdione Messages postés 13 Date d'inscription samedi 19 août 2006 Statut Membre Dernière intervention 11 novembre 2020 - 7 nov. 2020 à 12:46
Bonjour,

je veux récupérer le résultat après la fusion de plusieurs tables le code est le suivant

creation des tables

CREATE TABLE `tauxcotisation` (
  `date_debut` date NOT NULL,
  `date_fin` date NOT NULL,
  `tauxsal` decimal(6,3) NOT NULL,
  `tauxemp` decimal(6,3) NOT NULL
);

INSERT INTO `tauxcotisation` (`date_debut`, `date_fin`, `tauxsal`, `tauxemp`) VALUES  
('1961-01-01', '1966-06-30', 0.34, 0.34),
('1966-07-01', '1972-06-30', 0.15, 0.34),
('1972-07-01', '1972-09-30', 0.17, 0.34),
('1972-10-01', '1973-06-30', 0.17, 0.34),
('1973-07-01', '1980-02-29', 0.17, 0.34),
('1980-03-01', '1989-06-30', 0.17, 0.34),
('1989-07-01', '1995-12-31', 0.17, 0.34),
('1996-01-01', '2001-12-31', 0.41, 0.34),
('2002-01-01', '2010-01-01', 0.17, 0.34),
('2010-01-02', '2050-01-01', 0.17, 0.34);

CREATE TABLE `carriere` (
  `matricule` varchar(20) NOT NULL,
  `employeur` varchar(20) NOT NULL,
  `corps` varchar(20) NOT NULL,
  `grade` varchar(20) NOT NULL,
  `start_sal` date NOT NULL,
  `end_sal` date NOT NULL,
  `sal_base` decimal(9,3) NOT NULL
);

INSERT INTO `carriere` (`matricule`, `employeur`, `corps`,`grade`, `start_sal`, `end_sal`, `sal_base`) VALUES  
('994320', 'DBGT','Enseignant', 'Hierarchie A','1992-09-21', '2005-08-12', 4500),
('994320', 'CAMRAIL','Fonctionnaire', 'Hierarchie B','2005-08-13', '2009-09-16', 4900),
('994320', 'CCM','Universitaire', 'Autre','2009-09-17', '2019-07-12', 5300),
('994321', 'DBPNT','Enseignant', 'Hierarchie A','2002-09-21', '2005-08-12', 4500),
('994321', 'CAMRAIL','Fonctionnaire', 'Hierarchie B','2005-08-13', '2009-09-16', 4900),
('994322', 'DOUALPORT','Universitaire', 'Autre','2009-09-17', '2019-07-12', 5300);

CREATE TABLE `augmentation` (
  `St_date` date NOT NULL,
  `Ed_date` date NOT NULL,
  `grade` varchar(20) NOT NULL,
  `Montant` decimal(9,3) NOT NULL
);

INSERT INTO `augmentation` (`St_date`, `Ed_date`,`grade`, `Montant`) VALUES  
('1991-01-21', '2002-09-20','Hierarchie A', 201),
('1991-01-21', '2002-09-20','Hierarchie A', 201),
('2002-09-21', '2006-07-11','Hierarchie A', 200),
('2006-07-12', '2019-09-22','Hierarchie A', 210),
('1991-01-21', '2002-09-20','Hierarchie B', 201),
('1991-01-21', '2002-09-20','Hierarchie B', 201),
('2002-09-21', '2006-07-11','Hierarchie B', 200),
('2006-07-12', '2019-09-22','Hierarchie B', 210),
('1991-01-21', '2002-09-20','Autre', 201),
('1991-01-21', '2002-09-20','Autre', 201),
('2002-09-21', '2006-07-11','Autre', 200),
('2006-07-12', '2019-09-22','Autre', 210)

;


CREATE TABLE `rubrique` (
  `deb` date NOT NULL,
  `fin` date NOT NULL,
  `lblrubrique` varchar(20) NOT NULL,
  `corps` varchar(20) NOT NULL,
  `tauxrubrique` decimal(6,3) NOT NULL
);

INSERT INTO `rubrique` (`deb`, `fin`, `lblrubrique`, `corps`, `tauxrubrique`) VALUES  
('1991-01-01','3002/01/01' ,'css', 'Fonctionnaire', 0.20 ),
('2002/01/01','3002/01/01' , 'ir', 'Fonctionnaire', 0.14 ),
('1991/01/01','3002/01/01' ,'css', 'Enseignant', 0.20 ),
('2002/01/01','3002/01/01' , 'ir', 'Enseignant', 0.14 ),
('1900/06/30', '1989/12/31', 'ie', 'Enseignant',  0.20 ),
('1990/01/01', '2003/09/30', 'ie', 'Enseignant',  0.30),
('2003/10/01', '2005/09/30', 'ie', 'Enseignant',  0.35 ),
('2005/10/01', '2006/09/30', 'ie', 'Enseignant',  0.38),
('2006/10/01', '2007/09/30', 'ie', 'Enseignant',  0.41 ),
('2007/10/01', '2008/09/30', 'ie', 'Enseignant',  0.44 ),
('2008/10/01', '2009/09/30', 'ie', 'Enseignant',  0.47 ),
('2009/10/01', '3009/10/01', 'ie', 'Enseignant',  0.50 ),
('2002/01/01','3002/01/01' ,'css', 'Universitaire', 0.20 ),
('2002/01/01','3002/01/01' , 'ir', 'Universitaire', 0.14 ),
('1900/06/30', '1989/12/31', 'ie', 'Universitaire',  0.20 ),
('1990/01/01', '2003/09/30', 'ie', 'Universitaire',  0.30 ),
('2003/10/01', '2005/09/30', 'ie', 'Universitaire',  0.35 ),
('2005/10/01', '2006/09/30', 'ie', 'Universitaire',  0.38 ),
('2006/10/01', '2007/09/30', 'ie', 'Universitaire',  0.41 ),
('2007/10/01', '2008/09/30', 'ie', 'Universitaire',  0.44 ),
('2008/10/01', '2009/09/30', 'ie', 'Universitaire',  0.47 ),
('2009/10/01', '3009/10/01', 'ie', 'Universitaire',  0.50 ),
('2005/01/01', '2020-10-09', 'irf', 'Universitaire', 1.05);


+++++++++++++++++++++++++++++++++++++++++++++++

requete pour recuperer les données de la fusion


SELECT 
greatest(begin_date1,deb) AS begin_date2,
    least(end_date1,fin) AS end_date2,
    sal_base,
    tauxsal,
    tauxemp,
    Montant,
    lblrubrique,
    corps
    FROM rubrique,

((SELECT
  greatest(begin_date,St_date) AS begin_date1,
    least(end_date,Ed_date) AS end_date1,
    sal_base,
    tauxsal,
    tauxemp,
    grade,
    Montant
    FROM augmentation,
(
  SELECT
  greatest(start_sal,date_debut) AS begin_date,
  least(end_sal,date_fin) AS end_date,
  sal_base,
  tauxsal,
  tauxemp
FROM tauxcotisation, carriere
WHERE ((start_sal >= date_debut AND start_sal <= date_fin )
   OR (end_sal >= date_debut AND  end_sal <= date_fin   ))
   AND matricule = '994320' AND (start_sal = '1992-09-21' AND end_sal = '2005-08-12')
   
   

)as tab
WHERE ( begin_date >= St_date AND begin_date <= Ed_date)
   OR ( end_date >= St_date AND   end_date <= Ed_date))as tab1)
   
 WHERE (( begin_date1 >= deb AND begin_date1 <= fin)
   OR ( end_date1 >= deb AND   end_date1 <= fin))
   AND corps = 'Enseignant'
   AND grade = 'Hierarchie A'
   ;
  


++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Probleme

Entre le 1996-01-01 et 2001-12-31 il n y'a aucune donnée.
pouvez vous m'aider s'il vous plait?
Merci
--

1 réponse

Gandalfix Messages postés 84 Date d'inscription vendredi 12 juin 2020 Statut Non membre Dernière intervention 18 avril 2024 7
Modifié le 7 nov. 2020 à 05:35
Bonjour,

Je n'y connais pas grand chose en SQL pour le moment.

Néanmoins, en lisant votre code, je constate quelques points intriguants :

1. Dans la création de la table, vous utilisez 2 formats de dates : AAAA-MM-JJ (lignes 45 à 57) et AAAA/MM/JJ (lignes 71 à 93). Sur certaines lignes, il existe même des dates aux formats différents (exemple ligne 71). Par contre, il n'y a qu'n seul format dans la requête (AAA-MM-JJ).

2. Dans la création de la table, vous mettez des années incorrectes (3002 ligne 71, 3009 ligne 82, etc.).

Je vous invite à uniformiser le format des dates et à corriger les dates erronées, le problème vient peut-être de là.

Gandalfix

0
bireumdione Messages postés 13 Date d'inscription samedi 19 août 2006 Statut Membre Dernière intervention 11 novembre 2020
7 nov. 2020 à 12:46
Merci pour la réponse
J'ai effectivement corrigé suivant vos remarques.
mais j'ai résolu le problème en ajoutant une close where pour les dates qui se trouvent les deux dates recherchées.
Merci
0
Rejoignez-nous