Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

como obter o 3º relatório para combinar os dados do cliente e do pedido


Não acho que você precise usar unpivot . Para obter a data mais recente, basta usar o greatest() função.

Esta solução tem duas subconsultas, uma para calcular o app_mon para cada novo cliente e o outro para calcular a primeira data do pedido para todos os clientes que fizeram um pedido nos últimos dois anos. Essa pode não ser a abordagem mais performática, mas sua primeira prioridade deve ser obter o resultado correto; uma vez que você tenha isso, você pode ajustá-lo, se necessário:
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
/

Você pode querer ajustar meu cálculo de mon_diff . Este cálculo trata 01/02/2018 - 01/02/2018 como uma diferença de um mês. Porque me parece estranho que um cliente que faz um pedido no dia em que ingressou tenha um mon_diff de 1 em vez de zero. Mas se sua declaração da regra de negócios estiver correta, você precisará adicionar 1 ao cálculo. Da mesma forma, não incluí o trunc() no processamento das datas, mas você pode querer restabelecê-lo.