Tôi không nghĩ bạn cần sử dụng unpivot
. Để có ngày mới nhất, bạn chỉ cần sử dụng greatest()
chức năng.
Giải pháp này có hai truy vấn con, một để tính toán app_mon
cho mỗi khách hàng mới và khách hàng còn lại để tính ngày đặt hàng sớm nhất cho tất cả các khách hàng đã đặt hàng trong hai năm qua. Đây có thể không phải là cách tiếp cận hiệu quả nhất nhưng ưu tiên đầu tiên của bạn phải là đạt được kết quả chính xác; khi bạn có điều đó, bạn có thể điều chỉnh nó nếu cần:
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
/
Bạn có thể muốn điều chỉnh cách tính của tôi về mon_diff
. Phép tính này coi 2018/2/1 - 2018/1/1 là một tháng chênh lệch. Bởi vì tôi thấy hơi kỳ lạ khi một khách hàng đặt hàng vào ngày họ tham gia sẽ có mon_diff
của 1 thay vì 0. Nhưng nếu tuyên bố của bạn về quy tắc kinh doanh là chính xác, bạn sẽ cần thêm 1 vào phép tính. Tương tự như vậy, tôi chưa bao gồm trunc()
trong quá trình xử lý ngày tháng nhưng bạn có thể muốn khôi phục nó.