Oracle
 sql >> Base de données >  >> RDS >> Oracle

comment obtenir le 3ème rapport pour combiner les données client et commande

Je ne pense pas que vous ayez besoin d'utiliser unpivot . Pour obtenir la dernière date, vous pouvez simplement utiliser le greatest() fonction.

Cette solution a deux sous-requêtes, une pour calculer le app_mon pour chaque nouveau client et l'autre pour calculer la date de commande la plus proche pour tous les clients ayant passé une commande au cours des deux dernières années. Ce n'est peut-être pas l'approche la plus performante, mais votre première priorité devrait être d'obtenir le résultat correct ; une fois que vous l'avez, vous pouvez l'ajuster si nécessaire :

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
/

Vous voudrez peut-être modifier mon calcul de mon_diff . Ce calcul traite 2018/2/1 - 2018/1/1 comme une différence d'un mois. Parce qu'il me semble étrange qu'un client qui passe une commande le jour de son adhésion ait un mon_diff de 1 plutôt que de zéro. Mais si votre énoncé de la règle métier est correct, vous devrez ajouter 1 au calcul. De même, je n'ai pas inclus le trunc() dans le traitement des dates, mais vous souhaiterez peut-être le rétablir.