Saya rasa Anda tidak perlu menggunakan unpivot
. Untuk mendapatkan tanggal terbaru Anda cukup menggunakan greatest()
fungsi.
Solusi ini memiliki dua subkueri, satu untuk menghitung app_mon
untuk setiap pelanggan baru dan yang lainnya untuk menghitung tanggal pemesanan paling awal untuk semua pelanggan yang melakukan pemesanan dalam dua tahun terakhir. Ini mungkin bukan pendekatan yang paling performatif tetapi prioritas pertama Anda adalah mendapatkan hasil yang benar; setelah Anda memilikinya, Anda dapat menyetelnya jika perlu:
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
/
Anda mungkin ingin mengubah perhitungan saya mon_diff
. Perhitungan ini memperlakukan 2018/2/1 - 2018/1/1 sebagai perbedaan satu bulan. Karena menurut saya aneh bahwa pelanggan yang melakukan pemesanan pada hari mereka bergabung akan mendapatkan mon_diff
dari 1 bukan nol. Tetapi jika pernyataan Anda tentang aturan bisnis benar, Anda perlu menambahkan 1 ke dalam perhitungan. Demikian juga saya belum menyertakan trunc()
dalam pemrosesan tanggal tetapi Anda mungkin ingin mengembalikannya.