Bonjour à tous !
Je fais face à un petit soucis depuis quelques jours pour lequel je n'arrive pas à trouver de solution satisfaisante.
Concrètement, je dispose de 3 tables:
- future : on "capture" les ventes déjà effectuées pour une prestation à une date future. Nous avons donc la photoDate (date de capture), la dateTY (date de réalisation de la prestation) et qty (la quantité).
- past : ce sont les prestations réellement réalisées sur toutes les dates passées. Nous avons donc dateTY et qty.
- calendar : une liste de dates uniques (dateTY)
Ce que j'essaie de faire est de reconstituer une "photo" complète (passé + future) pour l'ensemble des dates photos existantes. J'arrive à le faire via un UNION pour une date photo bien précise, mais impossible de le faire pour l'ensemble des photos disponibles.
Avec l'exemple ci-dessous, je m'intéresse aux dates entre le 09 Septembre (@dteStart) et le 15 Septembre (@dteEnd) et à toutes les photos avant le 15 Septembre (@photoDate). Je m'attends donc à avoir une liste de dates de photos, avec pour chacune la totalité des dates entre @dteStart et @dteEnd : si la photoDate se situe avant la période étudiée, seule la table future est utilisée, si la photoDate est après cette période, uniquement la table past est utilisée, mais si elle est au milieu de cette période, les deux tables sont utilisées pour "reconstruire" la situation au moment donné.
Or ma requête ne me renvoi que les dates de la table future. Pourquoi ? Je pensais qu'en utilisant justement une table de calendrier et des LEFT JOIN me permettrait de toujours ressortir l'ensemble des dates.
Voici ma requête ainsi qu'un fiddle avec des données. Avez-vous une idée ?
Merci !!
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 SET @photoDate='2019-09-15'; SET @dteStart='2019-09-09'; SET @dteEnd='2019-09-15'; SELECT photoDate, c.dateTY, COALESCE(SUM(p.qty),SUM(f.qty)) Qty FROM calendar c LEFT JOIN ( SELECT photoDate,dateTY,SUM(qty) qty FROM future WHERE dateTY BETWEEN @dteStart AND @dteEnd GROUP BY photoDate,dateTY ) f ON photoDate <@photoDate AND c.dateTY=f.dateTY LEFT JOIN past p ON p.dateTY>@dteStart AND p.dateTY<photoDate AND c.dateTY = p.dateTY WHERE c.dateTY BETWEEN @dteStart AND @dteEnd GROUP BY photoDate,c.dateTY ORDER BY photoDate ASC, c.dateTY ASC
Partager