No creo que necesites usar unpivot
. Para obtener la fecha más reciente, puede usar greatest()
función.
Esta solución tiene dos subconsultas, una para calcular el app_mon
para cada nuevo cliente y el otro para calcular la fecha de pedido más temprana para todos los clientes que realizaron un pedido en los últimos dos años. Puede que este no sea el enfoque más eficaz, pero su primera prioridad debe ser obtener el resultado correcto; una vez que lo tengas, puedes ajustarlo si es necesario:
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
/
Es posible que desee modificar mi cálculo de mon_diff
. Este cálculo trata 2018/2/1 - 2018/1/1 como una diferencia de un mes. Porque me parece extraño que un cliente que hace un pedido el día que se unió tenga un mon_diff
de 1 en lugar de cero. Pero si su declaración de la regla comercial es correcta, deberá agregar 1 al cálculo. Del mismo modo, no he incluido el trunc()
en el procesamiento de las fechas pero es posible que desee restablecerlo.