sql >> Databáze >  >> RDS >> Oracle

jak získat 3. report pro spojení údajů o zákazníkovi a objednávce

Nemyslím si, že musíte použít unpivot . Chcete-li získat nejnovější datum, stačí použít greatest() funkce.

Toto řešení má dva dílčí dotazy, jeden pro výpočet app_mon pro každého nového zákazníka a pro druhého vypočítat nejbližší datum objednávky pro všechny zákazníky, kteří zadali objednávku v posledních dvou letech. Nemusí to být nejvýkonnější přístup, ale vaší první prioritou by mělo být dosažení správného výsledku; jakmile to budete mít, můžete to v případě potřeby naladit:

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žná budete chtít vyladit můj výpočet mon_diff . Tento výpočet považuje období 2018/2/1 – 2018/1/1 za jednoměsíční rozdíl. Protože se mi zdá divné, že zákazník, který zadá objednávku v den, kdy se připojil, by měl mon_diff 1 spíše než nula. Pokud je však vaše prohlášení obchodního pravidla správné, budete muset do výpočtu přidat 1. Stejně tak jsem nezahrnul trunc() při zpracování dat, ale možná jej budete chtít obnovit.




  1. ORACLE - regexp_substr pro vrácení hodnot null

  2. PHP7.0-FPM s Dockerem:Nelze načíst dynamickou knihovnu OCI8

  3. MySQL:Levé spojení a sloupec se stejným názvem v různých tabulkách

  4. Aktualizujte dotaz pomocí poddotazu na serveru SQL Server