Ik denk niet dat je unpivot
hoeft te gebruiken . Om de laatste datum te krijgen, kunt u gewoon de greatest()
. gebruiken functie.
Deze oplossing heeft twee subquery's, één om de app_mon
. te berekenen voor elke nieuwe klant en de andere om de vroegste besteldatum te berekenen voor alle klanten die in de afgelopen twee jaar een bestelling hebben geplaatst. Dit is misschien niet de meest performatieve benadering, maar je eerste prioriteit zou moeten zijn om het juiste resultaat te krijgen; als je dat eenmaal hebt, kun je het indien nodig afstemmen:
with cust as
(
select d.dist_id as id
, greatest(d.setup_dt, d.reinstate_dt, d.local_reinstate_dt) as app_mo
from mjensen_dev.gc_distributor d
where d.setup_dt >= date '2017-01-01'
or d.reinstate_dt >= date '2017-01-01'
or d.local_reinstate_dt >= date '2017-01-01'
) , ord as
(
select o.dist_id as id
, min(o.ord_dt) as ord_mon
, sum(o.oal) as ord_amt
from gc_orders o
where o.ord_dt >= date '2017-01-01'
group by o.dist_id
, trunc(o.ord_dt,'mm')
)
select cust.dist_id as id
, cust.app_mon
, ord.ord_mon
, floor(months_between(ord.ord_mon, cust.app_mon ) as mon_diff
, sum(o.oal) as ord_amt
from cust
inner join gc_orders o on cust.id = o.dist_id
order by 1, 2
/
Misschien wil je mijn berekening van mon_diff
. aanpassen . Deze berekening behandelt 2018/2/1 - 2018/1/1 als een maand verschil. Omdat het mij vreemd lijkt dat een klant die een bestelling plaatst op de dag dat ze lid werden, een mon_diff
zou hebben van 1 in plaats van nul. Maar als uw verklaring van de bedrijfsregel correct is, moet u 1 bij de berekening optellen. Evenzo heb ik de trunc()
. niet opgenomen in de verwerking van de datums, maar misschien wilt u deze herstellen.