Dans votre requête, vous croisez directement votre calendrier avec votre table de clients, vous faites donc une jointure puis un agrégat sur la somme cumulée de votre nb_lignes_clients par jour, sur 60 jours glissants, ce qui monte assez vite en terme de volume : en supposant 5 clients par jour pour simplifier le calcul (et j'espère que vous avez plus de clients que ça), ça vous donne un volume de 5 + 10 + 15 + 20... + 300 soit 9150 lignes.
Dans la requête que je vous ai proposée, on fait d'abord un agrégat du nombre de clients par jour, ce qui donne un résultat beaucoup plus petit mais surtout avec au maximum une ligne par jour.
Une fois la jointure faite sur le calendrier, le résultat en nombre de ligne sera au maximum 1 + 2 + 3 + 4 ... + 60 soit 1830 lignes, ce qui est finalement un petit résultat pour une jointure avec une inégalité, et le second agrégat est bien plus rapide à calculer.
Enfin sur votre code, perdez la mauvaise habitude permise sous MySQL d'avoir un SELECT différent de votre GROUP BY.
De plus, découvrez la fonction COALESCE et recoder ainsi :
Gardez aussi le coalesce dans la sum de second agrégat, il est utile pour "boucher les trous", surtout si vous en avez en début de période.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 select dat.dates as date_creation_client , sum(coalesce(cli.nb_clients, 0)) as nb_clients from dates as dat left join ( select coalesce(date_format(date_creation_client, '%Y%m%d'), '1970-01-01') as date_creation_client , count(*) as nb_clients from client group by coalesce(date_format(date_creation_client, '%Y%m%d'), '1970-01-01')) as cli on dat.dates >= cli.date_creation_client where dat.dates >= '2016-07-22' group by dat.dates order by dat.dates asc;
Partager