Ich glaube nicht, dass Sie unpivot
verwenden müssen . Um das neueste Datum zu erhalten, können Sie einfach greatest()
verwenden Funktion.
Diese Lösung hat zwei Unterabfragen, eine zur Berechnung von app_mon
für jeden Neukunden und zum anderen den frühesten Bestelltermin für alle Kunden, die in den letzten zwei Jahren eine Bestellung aufgegeben haben. Dies ist vielleicht nicht der leistungsstärkste Ansatz, aber Ihre erste Priorität sollte es sein, das richtige Ergebnis zu erzielen. Sobald Sie das haben, können Sie es bei Bedarf einstellen:
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
/
Vielleicht möchten Sie meine Berechnung von mon_diff
optimieren . Diese Berechnung behandelt 2018/2/1 - 2018/1/1 als Differenz von einem Monat. Weil es mir seltsam vorkommt, dass ein Kunde, der am Tag seines Beitritts eine Bestellung aufgibt, einen mon_diff
hat von 1 statt null. Aber wenn Ihre Aussage zur Geschäftsregel richtig ist, müssten Sie 1 zur Berechnung hinzufügen. Ebenso habe ich das trunc()
nicht eingebunden in der Verarbeitung der Daten, aber Sie möchten es vielleicht wieder aktivieren.