Oracle
 sql >> Datenbank >  >> RDS >> Oracle

So erhalten Sie den 3. Bericht, um die Kunden- und Bestelldaten zu kombinieren

Ich glaube nicht, dass Sie unpivot verwenden müssen . Um das neueste Datum zu erhalten, können Sie einfach greatest() verwenden Funktion.

Diese Lösung hat zwei Unterabfragen, eine zur Berechnung von app_mon für jeden Neukunden und zum anderen den frühesten Bestelltermin für alle Kunden, die in den letzten zwei Jahren eine Bestellung aufgegeben haben. Dies ist vielleicht nicht der leistungsstärkste Ansatz, aber Ihre erste Priorität sollte es sein, das richtige Ergebnis zu erzielen. Sobald Sie das haben, können Sie es bei Bedarf einstellen:

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
/

Vielleicht möchten Sie meine Berechnung von mon_diff optimieren . Diese Berechnung behandelt 2018/2/1 - 2018/1/1 als Differenz von einem Monat. Weil es mir seltsam vorkommt, dass ein Kunde, der am Tag seines Beitritts eine Bestellung aufgibt, einen mon_diff hat von 1 statt null. Aber wenn Ihre Aussage zur Geschäftsregel richtig ist, müssten Sie 1 zur Berechnung hinzufügen. Ebenso habe ich das trunc() nicht eingebunden in der Verarbeitung der Daten, aber Sie möchten es vielleicht wieder aktivieren.