sql >> Database >  >> RDS >> Oracle

hoe het 3e rapport te krijgen om de klant- en bestelgegevens te combineren?

Ik denk niet dat je unpivot hoeft te gebruiken . Om de laatste datum te krijgen, kunt u gewoon de greatest() . gebruiken functie.

Deze oplossing heeft twee subquery's, één om de app_mon . te berekenen voor elke nieuwe klant en de andere om de vroegste besteldatum te berekenen voor alle klanten die in de afgelopen twee jaar een bestelling hebben geplaatst. Dit is misschien niet de meest performatieve benadering, maar je eerste prioriteit zou moeten zijn om het juiste resultaat te krijgen; als je dat eenmaal hebt, kun je het indien nodig afstemmen:

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
/

Misschien wil je mijn berekening van mon_diff . aanpassen . Deze berekening behandelt 2018/2/1 - 2018/1/1 als een maand verschil. Omdat het mij vreemd lijkt dat een klant die een bestelling plaatst op de dag dat ze lid werden, een mon_diff zou hebben van 1 in plaats van nul. Maar als uw verklaring van de bedrijfsregel correct is, moet u 1 bij de berekening optellen. Evenzo heb ik de trunc() . niet opgenomen in de verwerking van de datums, maar misschien wilt u deze herstellen.




  1. Willekeurig getal genereren in elke rij in Oracle Query

  2. Postgresql - één database voor iedereen, of één database per klant

  3. MAAND() Voorbeelden – MySQL

  4. sql voor het vinden van de meest recente record in een groep