Jeg tror ikke, du behøver at bruge unpivot
. For at få den seneste dato kan du bare bruge greatest()
funktion.
Denne løsning har to underforespørgsler, en til at beregne app_mon
for hver ny kunde og den anden for at beregne den tidligste ordredato for alle kunder, der har afgivet en ordre inden for de seneste to år. Dette er måske ikke den mest effektive tilgang, men din første prioritet bør være at få det korrekte resultat; når du har det, kan du justere det, hvis det er nødvendigt:
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 ønsker måske at justere på min beregning af mon_diff
. Denne beregning behandler 2018/2/1 - 2018/1/1 som en måneds forskel. For det forekommer mig mærkeligt, at en kunde, der afgiver en ordre den dag, de tiltrådte, ville have en mon_diff
på 1 i stedet for nul. Men hvis din erklæring om forretningsreglen er korrekt, skal du tilføje 1 til beregningen. Ligeledes har jeg ikke inkluderet trunc()
i behandlingen af datoerne, men du ønsker måske at genindsætte det.