Bonjour,

j'ai un gros soucis, ca fais 2 jours que je cherche la solution mais sans succes !

Alors pour vous expliquer, je cherche a établir des statistiques sur les périodes d’arrêt ( en Nb de jours ) lors d'une maladie pro et ceux en fonction de l'année.

Voilà ma table


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 [dbo].[Tmaladies_professionnelles] (
[id_maladies_professionelles] int IDENTITY(1, 1) NOT NULL,
[id_MP_nom] int NULL,
[MP_date] smalldatetime NULL,
[id_MP_nature] tinyint NULL,
[MP_taux_IPP] tinyint NULL,
[MP_date_IPP] smalldatetime NULL,
[MP_taux_IPP_revise] tinyint NULL,
[MP_date_IPP_revise] smalldatetime NULL,
[MP_date_IPP_rejet] smalldatetime NULL,
[createur] varchar(25) NULL,
[date_creation] datetime NULL)
ON [PRIMARY]
WITH (DATA_COMPRESSION = NONE);
GO
ALTER TABLE [dbo].[Tmaladies_professionnelles] SET (LOCK_ESCALATION = TABLE);
GO
plusieurs champs ne doit pas etre prise en compte...

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
CREATE TABLE [dbo].[TAT_MP_arret] (
[id_MP_arret] int IDENTITY(1, 1) NOT NULL,
[id_MP] int NULL,
[MP_date_debut] smalldatetime NULL,
[MP_date_reprise] smalldatetime NULL,
[MP_nb_jours] int NULL,
[id_MP_type_arret] tinyint NULL)
ON [PRIMARY]
WITH (DATA_COMPRESSION = NONE);
GO
ALTER TABLE [dbo].[TAT_MP_arret] SET (LOCK_ESCALATION = TABLE);
GO
id_MP_arret	id_MP	MP_date_debut	MP_date_reprise	MP_nb_jours	id_MP_type_arret
3	18	28/06/2013 00:00	03/04/2014 00:00	279	10
2	17	12/12/2014 00:00	12/02/2015 00:00	62	10
4	18	06/06/2014 00:00	12/01/2015 00:00	220	20
9	21	30/04/2012 00:00	30/05/2016 00:00	1491	10
5	19	15/02/2015 00:00	29/03/2015 00:00	42	10
6	19	01/04/2015 00:00	02/06/2015 00:00	62	20
7	19	06/06/2015 00:00	30/09/2015 00:00	116	30
8	20	01/05/2013 00:00	05/02/2016 00:00	1010	10

et j'aimerai avoir comme resultat celui ci :

id_mp   |   Annee  |  Nb Jours
----------------------------------
21        | 2012      | 245
21        | 2013      | 365
21        | 2014      | 365
21        | 2015      | 365
21        | 2016      | 150
20        | 2013      | 244
20        | 2014      | 365
20        | 2015      | 365
20        | 2016      | 35
et la liste des périodes :

id_mp = 21 [ 30/04/2012 à 30/05/2016 ]
id_mp = 20 [ 01/05/2013 à 05/02/2016 ]


et voici mes premiere requetes :
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
64
65
66
67
68
69
70
71
 
/****** PERIODE DE LA DATE DEBUT JUSKA FIN DE L'ANNEE EN COURS****************/
 
SELECT mp_date [DateMP],
    YEAR(dbo.TAT_MP_arret.MP_date_debut)+1 [AnneeDebutArret], 
    DATEDIFF(day,'01/01/' + CONVERT(varchar,YEAR(MP_date_reprise)),MP_date_reprise) [DiffDate],
    MP_nb_jours [ NbJoursArretTotal],
    MP_date_debut,MP_date_reprise
 
 
    FROM dbo.Tmaladies_professionnelles,TAT_MP_arret
 
 
    WHERE dbo.Tmaladies_professionnelles.id_maladies_professionelles = dbo.TAT_MP_arret.id_MP
    AND YEAR(dbo.TAT_MP_arret.MP_date_debut) >= YEAR(SYSDATETIME())-5
    AND YEAR(dbo.TAT_MP_arret.MP_date_reprise) > YEAR(dbo.TAT_MP_arret.MP_date_debut)
 
 
 
/*** PERIODE SUR LA MEME ANNEE*****************************************/
 
SELECT mp_date [DateMP],
    YEAR(dbo.TAT_MP_arret.MP_date_debut) [AnneeDebutArret], 
    MP_nb_jours [ NbJoursArretTotal],
    MP_date_debut,MP_date_reprise
 
 
    FROM dbo.Tmaladies_professionnelles,TAT_MP_arret
 
 
    WHERE dbo.Tmaladies_professionnelles.id_maladies_professionelles = dbo.TAT_MP_arret.id_MP
    AND YEAR(dbo.TAT_MP_arret.MP_date_debut) >= YEAR(SYSDATETIME())-5
    AND YEAR(dbo.TAT_MP_arret.MP_date_reprise) = YEAR(dbo.TAT_MP_arret.MP_date_debut)
 
 
/****** PERIODE DU DEBUT DE L'ANNEE JUSQUA DATE REPRISE****************/
 
SELECT mp_date [DateMP],
    YEAR(dbo.TAT_MP_arret.MP_date_debut) [AnneeDebutArret], 
    DATEDIFF(day,MP_date_debut,'31/12/' + CONVERT(varchar,YEAR(MP_date_debut))) [DiffDate],
    MP_nb_jours [ NbJoursArretTotal],
    MP_date_debut,MP_date_reprise
 
 
    FROM dbo.Tmaladies_professionnelles,TAT_MP_arret
 
 
    WHERE dbo.Tmaladies_professionnelles.id_maladies_professionelles = dbo.TAT_MP_arret.id_MP
    AND YEAR(dbo.TAT_MP_arret.MP_date_debut) >= YEAR(SYSDATETIME())-5
    AND YEAR(dbo.TAT_MP_arret.MP_date_debut) < YEAR(dbo.TAT_MP_arret.MP_date_reprise)
 
 
 
/**** REQUETE SUR PLUSIEURS DE 2 ANNEES */
 
SELECT mp_date [DateMP],
    YEAR(dbo.TAT_MP_arret.MP_date_debut) [AnneeDebutArret], 
    DATEDIFF(day,MP_date_debut,'31/12/' + CONVERT(varchar,YEAR(MP_date_debut))) [DiffDate1],
    DATEDIFF(day,'01/01/' + CONVERT(varchar,YEAR(MP_date_reprise)),MP_date_reprise) [DiffDate2],
    MP_nb_jours [ NbJoursArretTotal],
    DATEDIFF(year,MP_date_debut,MP_date_reprise) * 365
    MP_date_debut,MP_date_reprise,
    (DATEDIFF(year,MP_date_debut,MP_date_reprise) - 1) *365
 
 
    FROM dbo.Tmaladies_professionnelles,TAT_MP_arret
 
 
    WHERE dbo.Tmaladies_professionnelles.id_maladies_professionelles = dbo.TAT_MP_arret.id_MP
    AND YEAR(dbo.TAT_MP_arret.MP_date_debut) >= YEAR(SYSDATETIME())-5
    AND DATEDIFF(year,MP_date_debut,MP_date_reprise) > 2


J'ai une requête qui permet d'avoir le nombre de jours pour l'année ou la période d’arrêt a commencer et a fini ( donc 2 année ) mais si la période s’étale sur plus de 2 ans , au milieu je n'ai pas le détail des jours par année et c'est ça le problème.

Voilà c'est dans le cas ou les période d’arrêt s’étale sur plusieurs année, j'ai déjà des requêtes pour les périodes d’arrêt pour les autres cas ( période d’arrêt sur la même année, et se chevauchant sur 2 année ) que je recouperai en fonction de l’année par un LEFT JOIN et je devrai avoir des chiffres correctes je pense par la suite !!

je sais bien que les tables sontmal conçu mais c'est le programme sur lequel je travaille je peux pas faire autrement...

Avez vous une idée ???

MERCI pour VOTRE AIDE