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
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
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
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); GOid_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 :
et la liste des périodes :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
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
Partager