Bonjour,

j'ai réalisé un code qui répond à ma demande mais dont je ne saurais expliquer le fonctionnement ()

Jeu de données :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
create table #ordre (val int, rang int null)
 
insert #ordre (val)
select 1
union select 10
union select 9
union select 7
union select 11
union select 21
union select 25
union select 3
union select 20
Requête :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
 
declare @i int , @maxi int
 
select @i = max(val) from #ordre
select @maxi = @i
 
UPDATE #ordre set rang = (select @i - @maxi
                          FROM #ordre o1
                          WHERE #ordre.val = o1.val
                          HAVING max(o1.val) < @i), @i = @i + 1
 
SELECT * from #ordre order by rang
En fait, elle met dans le champ rang, un genre d'ID permettant de trier le champ val par ordre croissant.

Ma question se porte essentiellement sur le HAVING...

Bref, quelqu'un saurait m'expliquer pourquoi et comment ce code fonctionne?