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

Tổng hợp nhiều bản ghi theo ngày

Tôi giả định rằng (patient_id, adherence_date, scheduled_time) là duy nhất trong bảng của bạn, có nghĩa là một bệnh nhân có thể đặt một lần cho mỗi "thời điểm" và ngày.

with medication_adherences  as(
-- This is your test data
   select 10049 as patient_id, 1 as id, date '2017-10-01' as adherence_date, 'morning'    as scheduled_time, timestamp '2017-10-31 19:59:19' as acknowledged_at from dual union all
   select 10049 as patient_id, 2 as id, date '2017-10-01' as adherence_date, 'afternoon'  as scheduled_time, null                            as acknowledged_at from dual union all                          
   select 10049 as patient_id, 3 as id, date '2017-10-01' as adherence_date, 'night'      as scheduled_time, timestamp '2017-10-31 19:59:19' as acknowledged_at from dual union all
   select 10049 as patient_id, 4 as id, date '2017-10-02' as adherence_date, 'morning'    as scheduled_time, timestamp '2017-10-31 19:59:19' as acknowledged_at from dual union all
   select 10049 as patient_id, 5 as id, date '2017-10-02' as adherence_date, 'afternoon'  as scheduled_time, timestamp '2017-10-31 19:59:19' as acknowledged_at from dual union all
   select 10049 as patient_id, 6 as id, date '2017-10-02' as adherence_date, 'evening'    as scheduled_time, timestamp '2017-10-31 19:59:19' as acknowledged_at from dual union all
   select 10049 as patient_id, 7 as id, date '2017-10-02' as adherence_date, 'night'      as scheduled_time, null                            as acknowledged_at from dual
)
select adherence_date
      ,sum(case when scheduled_time = 'morning'   then nvl2(acknowledged_at,1,0) end) as morning
      ,sum(case when scheduled_time = 'afternoon' then nvl2(acknowledged_at,1,0) end) as afternoon
      ,sum(case when scheduled_time = 'evening'   then nvl2(acknowledged_at,1,0) end) as evening
      ,sum(case when scheduled_time = 'night'     then nvl2(acknowledged_at,1,0) end) as night
  from medication_adherences 
 where patient_id = 10049
 group
    by adherence_date;

Logic hoạt động như sau:

  • nếu allow_at là null thì chúng tôi tổng hợp 0 ​​(thông qua nvl2)
  • if allow_at is not null thì chúng tôi tổng hợp 1 (thông qua nvl2)
  • nếu không có bản ghi nào cho khoảng thời gian này, chúng tôi tổng hợp là null (vì trường hợp khi ... không thành công)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hàm chứa () trong PL-SQL hoạt động như thế nào?

  2. OracleConnection.Open đang ném ORA-12541 TNS không có người nghe

  3. Tìm xem một cột trong Oracle có một chuỗi

  4. Cách chèn nhiều bản ghi vào Oracle DB bằng Node.js

  5. Liệt kê tên cột cho các chế độ xem của người dùng trong oracle