Je ne pense pas que vous ayez besoin d'utiliser unpivot
. Pour obtenir la dernière date, vous pouvez simplement utiliser le greatest()
fonction.
Cette solution a deux sous-requêtes, une pour calculer le app_mon
pour chaque nouveau client et l'autre pour calculer la date de commande la plus proche pour tous les clients ayant passé une commande au cours des deux dernières années. Ce n'est peut-être pas l'approche la plus performante, mais votre première priorité devrait être d'obtenir le résultat correct ; une fois que vous l'avez, vous pouvez l'ajuster si nécessaire :
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
/
Vous voudrez peut-être modifier mon calcul de mon_diff
. Ce calcul traite 2018/2/1 - 2018/1/1 comme une différence d'un mois. Parce qu'il me semble étrange qu'un client qui passe une commande le jour de son adhésion ait un mon_diff
de 1 plutôt que de zéro. Mais si votre énoncé de la règle métier est correct, vous devrez ajouter 1 au calcul. De même, je n'ai pas inclus le trunc()
dans le traitement des dates, mais vous souhaiterez peut-être le rétablir.