Не мисля, че трябва да използвате unpivot
. За да получите най-новата дата, можете просто да използвате greatest()
функция.
Това решение има две подзаявки, едната за изчисляване на app_mon
за всеки нов клиент, а другият за изчисляване на най-ранната дата на поръчка за всички клиенти, направили поръчка през последните две години. Това може да не е най-ефективният подход, но вашият първи приоритет трябва да бъде да получите правилния резултат; след като го имате, можете да го настроите, ако е необходимо:
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
/
Може да искате да промените моето изчисление на mon_diff
. Това изчисление третира 2018/2/1 - 2018/1/1 като разлика от един месец. Защото ми се струва странно клиент, който направи поръчка в деня, в който се е присъединил, да има mon_diff
на 1, а не на нула. Но ако изявлението ви за бизнес правилото е правилно, ще трябва да добавите 1 към изчислението. По същия начин не съм включил trunc()
при обработката на датите, но може да искате да го възстановите.