Bonsoir tout le monde,
Je sèche sur une requête SQL.... vous allez certainement pouvoir m'aider.
J'ai une table qui contient des personnes et pour chaque personne son Job title. Et j'ai une ligne par année.
Comme ceci :
Je souhaite regrouper les lignes, par personnes, par jobs successifs, avec les dates de débuts et de fin qui correspondent.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 Person JobTitle dateFrom dateTo Dupond Electricien 2001-01-01 2001-12-31 Dupond Electricien 2002-01-01 2002-12-31 Dupond Electricien 2003-01-01 2003-12-31 Dupond Plombier 2004-01-01 2004-12-31 Dupond Plombier 2005-01-01 2005-12-31 Dupond Plombier 2006-01-01 2006-12-31 Dupond Maçon 2007-01-01 2007-12-31 Dupond Maçon 2008-01-01 2008-12-31 Dupond Electricien 2009-01-01 2009-12-31 Dupond Electricien 2010-01-01 2010-12-31 Dupond Electricien 2011-01-01 NULL
Pour obtenir ceci :
La difficulté ici, est de faire 2 groupes, 2 lignes pour "Electricien".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Person JobTitle dateFrom dateTo Dupond Electricien 2001-01-01 2003-12-31 Dupond Plombier 2004-01-01 2006-12-31 Dupond Maçon 2007-01-01 2008-12-31 Dupond Electricien 2009-01-01 NULL
Il faut se baser sur l'ordre de la colonne dateFrom et le Job title pour regrouper.
J'ai essayé de faire une colonne artificielle en jouant avec LEAD(), LAG() et RANK() dans tous les sens, avec CTE récursive etc.. Je n'arrive à rien.
Si vous avez une idée je suis preneur, l'idée étant de ne pas le faire en procédural
Le petit jeu d'essai pour SQL Server :
Merci,
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 ;with cte AS ( select * from ( values ('Dupond', 'Electricien', '2001-01-01', '2001-12-31') , ('Dupond', 'Electricien', '2002-01-01', '2002-12-31') , ('Dupond', 'Electricien', '2003-01-01', '2003-12-31') , ('Dupond', 'Plombier' , '2004-01-01', '2004-12-31') , ('Dupond', 'Plombier' , '2005-01-01', '2005-12-31') , ('Dupond', 'Plombier' , '2006-01-01', '2006-12-31') , ('Dupond', 'Maçon' , '2007-01-01', '2007-12-31') , ('Dupond', 'Maçon' , '2008-01-01', '2008-12-31') , ('Dupond', 'Electricien', '2009-01-01', '2009-12-31') , ('Dupond', 'Electricien', '2010-01-01', '2010-12-31') , ('Dupond', 'Electricien', '2011-01-01', NULL) ) AS td(Person, JobTitle, dateFrom, dateTo) ) select * from cte
Bonne soirée
Partager