【问题标题】:PL-SQL query to calculate customers per period from start and stop datesPL-SQL 查询从开始和停止日期计算每个时期的客户
【发布时间】:2020-12-20 17:10:10
【问题描述】:

我有一个 PL-SQL 表,其结构如下例所示:

我的客户 (customer_number) 具有保险开始和结束日期(cover_start_date 和 cover_stop_date)。我也有这些客户的事故日期(accident_date)。如果这些客户发生了不止一次事故,他们的表格中可能会有不止一排。他们也可能没有事故。如果他们的保险正在进行,他们也可能有一个空白条目作为保险停止日期。对不起,我没有设计数据格式,但我坚持下去了。

我希望计算给定时间段 (period_start) 内的事故数量 (num_accidents) 和客户数量 (num_customers),并据此计算每个客户的事故数量(一旦我'有这两条信息)。

关于如何设计一个 PL-SQL 函数以简单的方式执行此操作的任何想法?理想情况下,时间段不固定为每月一次(例如,每周或每两周一次)?理想情况下,我最终会得到如下所示的表格:

非常感谢您的任何指点...

【问题讨论】:

  • 只是为了澄清术语,PL/SQL 是一种编程语言,而不是查询语言。我怀疑你的意思是SQL

标签: sql plsql


【解决方案1】:

您似乎需要一份日期列表。您可以在查询中生成一个,然后使用相关子查询来计算您想要的列:

select d.*,
       (select count(distinct customer_id)
        from t
        where t.cover_start_date <= d.dte and
              (t.cover_end_date > d.date + interval '1' month or t.cover_end_date is null)
       ) as num_customers,
       (select count(*)
        from t
        where t.accident_date >= d.dte and
              t.accident_date < d.date + interval '1' month
       ) as accidents,
       (select count(distinct customer_id)
        from t
        where t.accident_date >= d.dte and
              t.accident_date < d.date + interval '1' month
       ) as num_customers_with_accident
from (select date '2020-01-01' as dte from dual union all
      select date '2020-02-01' as dte from dual union all
      . . .
     ) d;

如果要对列进行算术运算,可以将其用作子查询或 CTE。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    • 2020-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多