Jag tror inte att du behöver använda unpivot
. För att få det senaste datumet kan du bara använda greatest()
funktion.
Denna lösning har två underfrågor, en för att beräkna app_mon
för varje ny kund och den andra för att beräkna det tidigaste beställningsdatumet för alla kunder som lagt en beställning under de senaste två åren. Detta kanske inte är det mest effektiva tillvägagångssättet men din första prioritet bör vara att få rätt resultat; när du har det kan du ställa in det om det behövs:
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
/
Du kanske vill finjustera min beräkning av mon_diff
. Denna beräkning behandlar 2018/2/1 - 2018/1/1 som en månads skillnad. För det förefaller mig konstigt att en kund som lägger en beställning den dag de gick med skulle ha en mon_diff
av 1 istället för noll. Men om ditt påstående om affärsregeln är korrekt skulle du behöva lägga till 1 i beräkningen. På samma sätt har jag inte inkluderat trunc()
under behandlingen av datumen men du kanske vill återställa den.