Oracle
 sql >> Baza danych >  >> RDS >> Oracle

jak uzyskać trzeci raport, aby połączyć dane klienta i zamówienia

Myślę, że nie musisz używać unpivot . Aby uzyskać najnowszą datę, możesz po prostu użyć greatest() funkcja.

To rozwiązanie ma dwa podzapytania, jedno do obliczenia app_mon dla każdego nowego klienta, a drugiego, aby obliczyć najwcześniejszą datę zamówienia dla wszystkich klientów, którzy złożyli zamówienie w ciągu ostatnich dwóch lat. To może nie być najbardziej wydajne podejście, ale Twoim priorytetem powinno być uzyskanie prawidłowego wyniku; kiedy już to zrobisz, możesz go dostroić w razie potrzeby:

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
/

Możesz poprawić moje obliczenia mon_diff . Ta kalkulacja traktuje 2018/2/1 - 2018/1/1 jako różnicę jednego miesiąca. Ponieważ wydaje mi się dziwne, że klient, który złoży zamówienie w dniu, w którym dołączył, miałby mon_diff 1 zamiast zera. Ale jeśli twoje stwierdzenie reguły biznesowej jest poprawne, musisz dodać 1 do obliczenia. Podobnie nie uwzględniłem trunc() w przetwarzaniu dat, ale możesz chcieć je przywrócić.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Autoinkrementacja Oracle z sekwencją i wyzwalaczem nie działa poprawnie

  2. Parametry połączenia Oracle ODP.NET:co znajduje się w źródle danych?

  3. Oracle SQL — Jak mogę wywołać funkcję potokową ODCI za pomocą JSP?

  4. Jak uzyskać dostęp do tabel systemowych Oracle z wnętrza funkcji lub procedury PL/SQL?

  5. Napisz instrukcję INSERT z klauzulą ​​select zwracającą identyfikator w oracle