Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

cách lấy báo cáo thứ 3 để kết hợp dữ liệu khách hàng và đơn đặt hàng

Tôi không nghĩ bạn cần sử dụng unpivot . Để có ngày mới nhất, bạn chỉ cần sử dụng greatest() chức năng.

Giải pháp này có hai truy vấn con, một để tính toán app_mon cho mỗi khách hàng mới và khách hàng còn lại để tính ngày đặt hàng sớm nhất cho tất cả các khách hàng đã đặt hàng trong hai năm qua. Đây có thể không phải là cách tiếp cận hiệu quả nhất nhưng ưu tiên đầu tiên của bạn phải là đạt được kết quả chính xác; khi bạn có điều đó, bạn có thể điều chỉnh nó nếu cần:

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
/

Bạn có thể muốn điều chỉnh cách tính của tôi về mon_diff . Phép tính này coi 2018/2/1 - 2018/1/1 là một tháng chênh lệch. Bởi vì tôi thấy hơi kỳ lạ khi một khách hàng đặt hàng vào ngày họ tham gia sẽ có mon_diff của 1 thay vì 0. Nhưng nếu tuyên bố của bạn về quy tắc kinh doanh là chính xác, bạn sẽ cần thêm 1 vào phép tính. Tương tự như vậy, tôi chưa bao gồm trunc() trong quá trình xử lý ngày tháng nhưng bạn có thể muốn khôi phục nó.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. org.hibernate.Query .iterate () VS .getResultList () tạo truy vấn

  2. Làm thế nào để sử dụng một hằng gói trong câu lệnh SQL SELECT?

  3. Oracle SQL Injection Block với DBMS_ASSERT

  4. làm thế nào để lặp lại việc chấp nhận đầu vào của người dùng với pl / sql?

  5. Thứ tự tham số thủ tục được lưu trữ trong C # Oracle