मुझे नहीं लगता कि आपको unpivot
. का उपयोग करने की आवश्यकता है . नवीनतम तिथि प्राप्त करने के लिए आप केवल greatest()
. का उपयोग कर सकते हैं समारोह।
इस समाधान में दो उपश्रेणियाँ हैं, एक app_mon
. की गणना करने के लिए प्रत्येक नए ग्राहक और दूसरे के लिए पिछले दो वर्षों में ऑर्डर देने वाले सभी ग्राहकों के लिए जल्द से जल्द ऑर्डर तिथि की गणना करने के लिए। यह सबसे अधिक प्रदर्शनकारी दृष्टिकोण नहीं हो सकता है लेकिन आपकी पहली प्राथमिकता सही परिणाम प्राप्त करना होना चाहिए; एक बार आपके पास यह हो जाने के बाद यदि आवश्यक हो तो आप इसे ट्यून कर सकते हैं:
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
/
आप mon_diff
. की मेरी गणना में बदलाव करना चाह सकते हैं . यह गणना 2018/2/1 - 2018/1/1 को एक महीने के अंतर के रूप में मानती है। क्योंकि मुझे यह अजीब लगता है कि एक ग्राहक जो ऑर्डर देने वाले दिन ऑर्डर देता है, उसके पास एक mon_diff
होगा। 1 के बजाय शून्य। लेकिन यदि आपका व्यवसाय नियम का विवरण सही है तो आपको गणना में 1 जोड़ना होगा। इसी तरह मैंने trunc()
. को शामिल नहीं किया है तिथियों के प्रसंस्करण में लेकिन आप इसे बहाल करना चाह सकते हैं।