首页 > 解决方案 > 给定开始和结束日期的预计付款日期

问题描述

我正在尝试创建一个 SQL 视图,该视图为我提供了在日历日之前收到的重复交易的预期金额。我有一个包含经常性承诺数据的表,其中包含以下列:

id, 
start_date, 
end_date (null if still active), 
payment day (1,2,3,etc.), 
frequency (monthly, quarterly, semi-annually, annually), 
commitment amount

现在,我不需要担心工作日和日历日。

以最简单的形式,最终结果将包含每个历史日历日以及下一年的未来日期,并产生在这些特定日子里/预计会收到多少。

我已经做了很多研究,但似乎找不到解决特定问题的答案。任何关于从哪里开始的方向将不胜感激。

预期输出将如下所示:

| Date    | Expected Amount |

|1/1/18   |  100  | 
|1/2/18   |  200  | 
|1/3/18   |  150  | 

提前谢谢你!

链接到 db-fiddle
预期输出电子表格中的数据表

标签: sqlnetezzarecurring-events

解决方案


是这样的,但我从未使用过 Netezza

SELECT 
  cal.d, sum(r.amount) as expected_amount
FROM
  (
    SELECT MIN(a.start_date) + ROW_NUMBER() OVER(ORDER BY NULL) as d
    FROM recurring a, recurring b, recurring c
  )  cal 
  LEFT JOIN
  recurring r
  ON 
    (
     (r.frequency = 'monthly' AND r.payment_day = DATE_PART('DAY', cal.d)) OR 
     (r.frequency = 'annually' AND DATE_PART('MONTH', cal.d) = DATE_PART('MONTH', r.start_date) AND r.payment_day = DATE_PART('DAY', cal.d))
    ) AND 
    r.start_date >= cal.d AND 
    (r.end_date <= cal.d OR r.end_date IS NULL)
GROUP BY cal.d

本质上,我们将我们的循环表多次笛卡尔连接在一起以生成大量行,对它们进行编号并将数字添加到最小日期以获得递增的日期系列。

付款数据表在以下日期与此递增日期系列保持连接:

  • (系列日期的日期)=(付款日)每月
  • (系列日期的月日)=(开始日期的月份和付款日)

最后,将整个批次进行分组和汇总

我没有 Netezza 的测试实例,所以如果您遇到一些小的语法错误,请尝试自己修复它们(以便您更快地获得解决方案)。如果您无法弄清楚查询在做什么,请告诉我


推荐阅读