sql >> Base de Datos >  >> RDS >> Oracle

cómo obtener el tercer informe para combinar los datos del cliente y del pedido

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.