Oracle
 sql >> Database >  >> RDS >> Oracle

come ottenere il 3° report per combinare i dati del cliente e dell'ordine

Non credo che tu debba usare unpivot . Per ottenere l'ultima data puoi semplicemente usare greatest() funzione.

Questa soluzione ha due sottoquery, una per calcolare app_mon per ogni nuovo cliente e per l'altro calcolare la prima data dell'ordine per tutti i clienti che hanno effettuato un ordine negli ultimi due anni. Questo potrebbe non essere l'approccio più performativo, ma la tua prima priorità dovrebbe essere quella di ottenere il risultato corretto; una volta che hai che puoi sintonizzarlo se necessario:

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
/

Potresti voler modificare il mio calcolo di mon_diff . Questo calcolo considera il 1/2/2018 - 1/1/2018 come differenza di un mese. Perché mi sembra strano che un cliente che effettua un ordine il giorno in cui si è unito abbia un mon_diff di 1 anziché zero. Ma se la tua affermazione della regola aziendale è corretta, dovresti aggiungere 1 al calcolo. Allo stesso modo non ho incluso trunc() nell'elaborazione delle date ma potresti volerlo reintegrare.