* Bonjour, *
J'ai un jeu de lignes avec dans une colonne un seuil maximum à ne pas dépasser.
=> Des employés avec une durée de travail hebdomadaire
J'ai ensuite une série de ligne en face desquelles je dois mettre une et une seule ligne de mon jeu de données précédent. Pour le moment, pas de notion d'ordre ou de priorité : premier trouvé, premier utilisé.
=> Un planning, où pour chaque heure je dois avoir un employé en activité
Cela implique donc que lorsque je mets un employé sur une case du planning, je dois décrémenter son seuil d'heures, sans pour autant modifier le seuil des autres.
Comment faire ?
Plutôt qu'un long discours, voici ma requête actuelle :
Les deux premières CTE sont là pour éviter d'avoir à crée des tables.
Code sql : 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 with horaire (heure) as ( select 1 heure union all select heure + 1 from horaire where heure < 10 ), employe (id, temps_travail) as ( select 1, 3 union all select 2, 4 union all select 3, 5 ), occupation (heure, id, duree, temps_travail) as ( select horaire.heure, employe.id, count(*) over(partition by employe.id order by horaire.heure) duree, employe.temps_travail from horaire cross join employe ) select * from occupation where temps_travail >= duree;
Ce qui me donne :
Moi j'aurais préféré...
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 heure id duree temps_travail ----------- ----------- ----------- ------------- 1 1 1 3 2 1 2 3 3 1 3 3 1 2 1 4 2 2 2 4 3 2 3 4 4 2 4 4 1 3 1 5 2 3 2 5 3 3 3 5 4 3 4 5 5 3 5 5 (12*ligne(s) affectée(s))
Évidemment, je cherche à faire ça "proprement", c'est à dire sans langage procédural.
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 heure id duree temps_travail ----------- ----------- ----------- ------------- 1 1 1 3 2 1 2 3 3 1 3 3 4 2 1 4 5 2 2 4 6 2 3 4 7 2 4 4 8 3 1 5 9 3 2 5 10 3 3 5 (10*ligne(s) affectée(s))
* Merci *
Partager