Question souvent posée :
J'ai des vendeurs qui travaillent sur plusieurs villes, si j'interroge ma base, j'obtiens :
je voudrais :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 1 Paris 1 Lille 1 Lyon 1 Marseille 1 Bordeaux 2 Paris 2 Lyon 2 Brest 3 Paris
Cette question est souvent rejeté au rang de cosmétique, personnellement, j'ai tendance à penser (hors tous problèmes de performance) qu'il s'agit d'une fonction agrégative au même titre que SUM ou AVG (mais avec des problèmes spécifiques de taille, d'ordre, etc...).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 3 Paris 2 Brest;Lyon;Paris 1 Bordeaux;Lille;Lyon;Marseille;Paris
Voici une solution avec le WITH RECURSIVE de la norme SQL (en fait il n'y a pas le "RECURSIVE", puisque SQLExpress 2005 supporte la fonction, mais pas le mot clé )
Attention, cette solution est sans doute assez mauvaise en terme de performance si le nombre de "Villes" est élevé.
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 create table Territoire (IdVendeur integer, Ville varchar(20)) insert into Territoire values (1, 'Paris'); insert into Territoire values (1, 'Lille'); insert into Territoire values (1, 'Lyon'); insert into Territoire values (1, 'Marseille'); insert into Territoire values (1, 'Bordeaux'); insert into Territoire values (2, 'Paris'); insert into Territoire values (2, 'Lyon'); insert into Territoire values (2, 'Brest'); insert into Territoire values (3, 'Paris'); with px (idVendeur, Villes, Precedente, Niveau) as ( select IdVendeur, cast(Ville as varchar(MAX)), cast (ville as varchar(MAX)), 1 from Territoire a where Ville = (select min(Ville) from Territoire b where a.idVendeur = b.idVendeur) union all select a.IdVendeur, px.Villes + ';' + a.ville, cast(a.Ville as varchar(max)), Niveau + 1 from Territoire a inner join px on a.idVendeur = px.idVendeur and a.Ville > px.Precedente ) select IdVendeur, Villes from px a where Niveau = (select max(Niveau) from px b where a.idVendeur = b.idVendeur)
Je posterais une solution pour ORACLE et le CONNECT BY d'ici peu dans dans ce même fil, j'ai une requête qui marche, mais je veux "l'améliorer"
Partager