Bonjour,

Je travaille sur sql server 2008, je dois construire une requête qui est composée par plusieurs sous requêtes.
Pour cela, j'ai développé deux requêtes
requete 1 temps de réponse 20 seconde
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
26
27
28
29
30
31
32
33
34
35
36
SELECT   sect.lg_nomparent lg,  COUNT(DISTINCT a.lg_annonceur) AS ann   FROM          FilteredLg_compterendu AS a 
   INNER JOIN  Filteredlg_systemuser_lg_compterendu AS b ON b.lg_compterenduid = a.lg_compterenduid 
 INNER JOIN FilteredSystemUser AS usr ON usr.systemuserid = b.systemuserid 
  INNER JOIN  FilteredAccount AS d ON d.accountid = a.lg_annonceur 
 INNER JOIN FilteredLg_terraindejeu AS e ON e.lg_annonceur = d.accountid
  inner join FilteredLg_ouvertureterrainsdejeu ouv on ouv.lg_commercial=usr.systemuserid
  inner join FilteredLg_secteurdactivite sect on sect.lg_secteurdactiviteid=e.lg_secteurdactivite
  inner join Filteredlg_lg_pole_systemuser pole_usr on pole_usr.systemuserid=usr.systemuserid
  inner join FilteredLg_pole pole on pole_usr.lg_poleid=pole.lg_poleid
 WHERE     convert(nvarchar(max),a.lg_daterdv ,112) BETWEEN convert (nvarchar(max),ouv.lg_datededebut,112) AND convert (nvarchar(max),ouv.lg_datedefin,112)
 and e.lg_commercial=usr.systemuserid 
and pole.lg_name='INTERNET'
 GROUP BY sect.lg_nomparent

requete 2 temps de réponse 5 sec

select sec.lg_nomparent,
count(distinct prioritaire.count_prioritaire) as 'Client LP prioritaire',
count (distinct count_client) as 'Client LP',
count(distinct count_prospect) as 'Prospect',

 from FilteredLg_secteurdactivite sec  
 inner join FilteredLg_terraindejeu Ter on sec.lg_secteurdactiviteid=Ter.lg_secteurdactivite
inner join FilteredSystemUser usr on usr.systemuserid=ter.lg_commercial
inner join Filteredlg_lg_pole_systemuser pole_usr on pole_usr.systemuserid=usr.systemuserid
inner join FilteredLg_pole pole on pole.lg_poleid=pole_usr.lg_poleid and   pole.lg_name='INTERNET'
 left  join  (select distinct(lg_annonceur) count_prioritaire,lg_terraindejeuid
 from FilteredLg_terraindejeu where lg_statut=1 and lg_annonceur is not null
 ) prioritaire on Ter.lg_terraindejeuid=prioritaire.lg_terraindejeuid
 left  join(select distinct(lg_annonceur) count_client,lg_terraindejeuid
 from FilteredLg_terraindejeu where lg_statut=2 and lg_annonceur is not null
 ) Client on Ter.lg_terraindejeuid=Client.lg_terraindejeuid
 left  join  (select distinct(lg_annonceur) count_prospect,lg_terraindejeuid
  from FilteredLg_terraindejeu where lg_statut=3 and lg_annonceur is not null
 ) prospect on Ter.lg_terraindejeuid=prospect.lg_terraindejeuid
Ces deux requêtes sont jointes par la notion de secteur (sec) comme suit sur la requete finale:

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
select sec.lg_nomparent,
count(distinct prioritaire.count_prioritaire) as 'Client LP prioritaire',
count (distinct count_client) as 'Client LP',
count(distinct count_prospect) as 'Prospect',
 
H.ann as H
 
 from FilteredLg_secteurdactivite sec  
 inner join FilteredLg_terraindejeu Ter on sec.lg_secteurdactiviteid=Ter.lg_secteurdactivite
inner join FilteredSystemUser usr on usr.systemuserid=ter.lg_commercial
inner join Filteredlg_lg_pole_systemuser pole_usr on pole_usr.systemuserid=usr.systemuserid
inner join FilteredLg_pole pole on pole.lg_poleid=pole_usr.lg_poleid and   pole.lg_name='INTERNET'
 left  join  (select distinct(lg_annonceur) count_prioritaire,lg_terraindejeuid
 from FilteredLg_terraindejeu where lg_statut=1 and lg_annonceur is not null
 ) prioritaire on Ter.lg_terraindejeuid=prioritaire.lg_terraindejeuid
 left  join(select distinct(lg_annonceur) count_client,lg_terraindejeuid
 from FilteredLg_terraindejeu where lg_statut=2 and lg_annonceur is not null
 ) Client on Ter.lg_terraindejeuid=Client.lg_terraindejeuid
 left  join  (select distinct(lg_annonceur) count_prospect,lg_terraindejeuid
  from FilteredLg_terraindejeu where lg_statut=3 and lg_annonceur is not null
 ) prospect on Ter.lg_terraindejeuid=prospect.lg_terraindejeuid
 /* calcul colonne H = Nombre d’annonceurs distincts appartenant à la famille de secteur d’activité A et faisant parti du terrain de jeu 
 du commercial Z ayant au moins 1 compte rendu où le commercial Z est dans la liste des Commerciaux et dont la date de rendez-vous est comprise entre la date de début et de fin du tdj */
  left join (SELECT   sect.lg_nomparent lg_sec,  COUNT(DISTINCT a.lg_annonceur) AS ann
   FROM          FilteredLg_compterendu AS a 
   INNER JOIN  Filteredlg_systemuser_lg_compterendu AS b ON b.lg_compterenduid = a.lg_compterenduid 
 INNER JOIN FilteredSystemUser AS usr ON usr.systemuserid = b.systemuserid 
  INNER JOIN  FilteredAccount AS d ON d.accountid = a.lg_annonceur 
 INNER JOIN FilteredLg_terraindejeu AS e ON e.lg_annonceur = d.accountid
  inner join FilteredLg_ouvertureterrainsdejeu ouv on ouv.lg_commercial=usr.systemuserid
  inner join FilteredLg_secteurdactivite sect on sect.lg_secteurdactiviteid=e.lg_secteurdactivite
  inner join Filteredlg_lg_pole_systemuser pole_usr on pole_usr.systemuserid=usr.systemuserid
  inner join FilteredLg_pole pole on pole_usr.lg_poleid=pole.lg_poleid
 WHERE     convert(nvarchar(max),a.lg_daterdv ,112) BETWEEN convert (nvarchar(max),ouv.lg_datededebut,112) AND convert (nvarchar(max),ouv.lg_datedefin,112)
 and e.lg_commercial=usr.systemuserid 
and pole.lg_name='INTERNET'
 GROUP BY sect.lg_nomparent
) AS H on sec.lg_nomparent=H.lg_sec
  group by sec.lg_nomparent,H.ann
Cette requête tourne sans renvoyer de résultat, je ne vois pas de produit cartésien, c bizare
Merci pour votre aide