Myślę, że nie musisz używać unpivot
. Aby uzyskać najnowszą datę, możesz po prostu użyć greatest()
funkcja.
To rozwiązanie ma dwa podzapytania, jedno do obliczenia app_mon
dla każdego nowego klienta, a drugiego, aby obliczyć najwcześniejszą datę zamówienia dla wszystkich klientów, którzy złożyli zamówienie w ciągu ostatnich dwóch lat. To może nie być najbardziej wydajne podejście, ale Twoim priorytetem powinno być uzyskanie prawidłowego wyniku; kiedy już to zrobisz, możesz go dostroić w razie potrzeby:
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
/
Możesz poprawić moje obliczenia mon_diff
. Ta kalkulacja traktuje 2018/2/1 - 2018/1/1 jako różnicę jednego miesiąca. Ponieważ wydaje mi się dziwne, że klient, który złoży zamówienie w dniu, w którym dołączył, miałby mon_diff
1 zamiast zera. Ale jeśli twoje stwierdzenie reguły biznesowej jest poprawne, musisz dodać 1 do obliczenia. Podobnie nie uwzględniłem trunc()
w przetwarzaniu dat, ale możesz chcieć je przywrócić.