Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

cara mendapatkan laporan ke-3 untuk menggabungkan data pelanggan dan pesanan

Saya rasa Anda tidak perlu menggunakan unpivot . Untuk mendapatkan tanggal terbaru Anda cukup menggunakan greatest() fungsi.

Solusi ini memiliki dua subkueri, satu untuk menghitung app_mon untuk setiap pelanggan baru dan yang lainnya untuk menghitung tanggal pemesanan paling awal untuk semua pelanggan yang melakukan pemesanan dalam dua tahun terakhir. Ini mungkin bukan pendekatan yang paling performatif tetapi prioritas pertama Anda adalah mendapatkan hasil yang benar; setelah Anda memilikinya, Anda dapat menyetelnya jika perlu:

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
/

Anda mungkin ingin mengubah perhitungan saya mon_diff . Perhitungan ini memperlakukan 2018/2/1 - 2018/1/1 sebagai perbedaan satu bulan. Karena menurut saya aneh bahwa pelanggan yang melakukan pemesanan pada hari mereka bergabung akan mendapatkan mon_diff dari 1 bukan nol. Tetapi jika pernyataan Anda tentang aturan bisnis benar, Anda perlu menambahkan 1 ke dalam perhitungan. Demikian juga saya belum menyertakan trunc() dalam pemrosesan tanggal tetapi Anda mungkin ingin mengembalikannya.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana saya bisa membersihkan koneksi mati menggunakan Oracle?

  2. Apa solusi terbaik untuk masalah yang diketahui dengan validasi skema Hibernate untuk kolom floating point saat menggunakan Oracle 10g?

  3. Menyimpan Alamat IP dalam Tabel Oracle SQL

  4. hubungkan dengan klausa di regex_substr

  5. Tidak termasuk Tabel yang Tidak Didukung Untuk Diambil Oleh Oracle Streams