Nemyslím si, že musíte použít unpivot
. Chcete-li získat nejnovější datum, stačí použít greatest()
funkce.
Toto řešení má dva dílčí dotazy, jeden pro výpočet app_mon
pro každého nového zákazníka a pro druhého vypočítat nejbližší datum objednávky pro všechny zákazníky, kteří zadali objednávku v posledních dvou letech. Nemusí to být nejvýkonnější přístup, ale vaší první prioritou by mělo být dosažení správného výsledku; jakmile to budete mít, můžete to v případě potřeby naladit:
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žná budete chtít vyladit můj výpočet mon_diff
. Tento výpočet považuje období 2018/2/1 – 2018/1/1 za jednoměsíční rozdíl. Protože se mi zdá divné, že zákazník, který zadá objednávku v den, kdy se připojil, by měl mon_diff
1 spíše než nula. Pokud je však vaše prohlášení obchodního pravidla správné, budete muset do výpočtu přidat 1. Stejně tak jsem nezahrnul trunc()
při zpracování dat, ale možná jej budete chtít obnovit.