sql >> Databasteknik >  >> RDS >> Oracle

hur man får den 3:e rapporten att kombinera kund- och orderdata

Jag tror inte att du behöver använda unpivot . För att få det senaste datumet kan du bara använda greatest() funktion.

Denna lösning har två underfrågor, en för att beräkna app_mon för varje ny kund och den andra för att beräkna det tidigaste beställningsdatumet för alla kunder som lagt en beställning under de senaste två åren. Detta kanske inte är det mest effektiva tillvägagångssättet men din första prioritet bör vara att få rätt resultat; när du har det kan du ställa in det om det behövs:

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
/

Du kanske vill finjustera min beräkning av mon_diff . Denna beräkning behandlar 2018/2/1 - 2018/1/1 som en månads skillnad. För det förefaller mig konstigt att en kund som lägger en beställning den dag de gick med skulle ha en mon_diff av 1 istället för noll. Men om ditt påstående om affärsregeln är korrekt skulle du behöva lägga till 1 i beräkningen. På samma sätt har jag inte inkluderat trunc() under behandlingen av datumen men du kanske vill återställa den.




  1. Oracle SQL Cross Tab Query

  2. Mer SQL, mindre kod, med PostgreSQL

  3. Kan ett C#-program läsa en textfil i minnet och sedan skicka det objektet till en metod som kräver ett filnamn?

  4. MariaDB CURRENT_TIME() Förklarad