Bonjour,
J'ai une table dasn laquelle on enregistre le nombre de collaborateur à une date donnée.
Voici le script de création et quelques insert
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 CREATE TABLE [dbo].[EFFECTIF]( [ID_EFFECTIF] [int] IDENTITY(1,1) NOT NULL, [ID_ENTREPRISE] [int] NOT NULL, [NbCollaborateur] [int] NULL, [Date_Modification] [datetime] NULL, CONSTRAINT [PK_EFFECTIF] PRIMARY KEY CLUSTERED ( [ID_EFFECTIF] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]ce qui donne le jeu de données suivant
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 INSERT INTO EFFECTIF ([ID_EFFECTIF], [ID_ENTREPRISE], [NbCollaborateur], [Date_Modification]) VALUES (1, 5, 100, 'Jan 10 2000 12:00AM') INSERT INTO EFFECTIF ([ID_EFFECTIF], [ID_ENTREPRISE], [NbCollaborateur], [Date_Modification]) VALUES (2, 5, 110, 'Mar 10 2014 12:00AM') INSERT INTO EFFECTIF ([ID_EFFECTIF], [ID_ENTREPRISE], [NbCollaborateur], [Date_Modification]) VALUES (3, 5, 220, 'Nov 11 2014 12:00AM') INSERT INTO EFFECTIF ([ID_EFFECTIF], [ID_ENTREPRISE], [NbCollaborateur], [Date_Modification]) VALUES (4, 5, 150, 'Jan 1 2016 12:00AM') INSERT INTO EFFECTIF ([ID_EFFECTIF], [ID_ENTREPRISE], [NbCollaborateur], [Date_Modification]) VALUES (5, 5, 110, 'May 1 2016 12:00AM') INSERT INTO EFFECTIF ([ID_EFFECTIF], [ID_ENTREPRISE], [NbCollaborateur], [Date_Modification]) VALUES (6, 5, 90, 'Dec 1 2016 12:00AM') INSERT INTO EFFECTIF ([ID_EFFECTIF], [ID_ENTREPRISE], [NbCollaborateur], [Date_Modification]) VALUES (7, 5, 200, 'Dec 31 2016 12:00AM')
Je dois obtenir pour une entreprise donnée (ici je n'en ai créé qu'une donc ce sera la 5) pour les 4 dernières années la dernière valeur pour nbcollaborateur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 ID_EFFECTIF ID_ENTREPRISE NbCollaborateur Date_Modification 1 5 100 2000-01-10 00:00:00.000 2 5 110 2014-03-10 00:00:00.000 3 5 220 2014-11-11 00:00:00.000 4 5 150 2016-01-01 00:00:00.000 5 5 110 2016-05-01 00:00:00.000 6 5 90 2016-12-01 00:00:00.000 7 5 200 2016-12-31 00:00:00.000
En sus, si une année il n'y a pas de nbcollateur qui a été encodé, j'ai besoin d'obtenir la dernière valeur non null.
Ce qui dans mon jeu de donnée donnerait
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 refyear NbCollaborateur 2014 220 2015 220 2016 200 2017 200me donne
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 With REFYEAR (refyear) as ( SELECT year(getdate()) as REF_Year UNION ALL SELECT year(getdate())-1 as REF_Year UNION ALL SELECT year(getdate())-2 as REF_Year UNION ALL SELECT year(getdate()) -3 as REF_Year ) SELECT refyear, [NbCollaborateur] FROM (SELECT ID_ENTREPRISE as ID_ENTREPRISE, REFYEAR.refyear, [NbCollaborateur], ROW_NUMBER() OVER(PARTITION BY REFYEAR.refyear ORDER BY E.[Date_Modification] DESC) AS rn FROM refyear LEFT OUTER JOIN [dbo].[EFFECTIF] E ON year(E.Date_Modification) = refyear.refyear --WHERE ID_ENTREPRISE = 5 ) AS T where T.rn = 1
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 refyear NbCollaborateur 2014 220 2015 NULL 2016 200 2017 NULLme donne
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 With REFYEAR (refyear) as ( SELECT year(getdate()) as REF_Year UNION ALL SELECT year(getdate())-1 as REF_Year UNION ALL SELECT year(getdate())-2 as REF_Year UNION ALL SELECT year(getdate()) -3 as REF_Year ) SELECT refyear, [NbCollaborateur] FROM (SELECT ID_ENTREPRISE as ID_ENTREPRISE, REFYEAR.refyear, [NbCollaborateur], ROW_NUMBER() OVER(PARTITION BY REFYEAR.refyear ORDER BY E.[Date_Modification] DESC) AS rn FROM refyear LEFT OUTER JOIN [dbo].[EFFECTIF] E ON year(E.Date_Modification) = refyear.refyear WHERE ID_ENTREPRISE = 5 ) AS T where T.rn = 1
Merci d'avance pour votre aide
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 refyear NbCollaborateur 2014 220 2016 200
Cordialement,
Partager