sql - 给定开始和结束日期的预计付款日期
问题描述
我正在尝试创建一个 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 |
提前谢谢你!
解决方案
是这样的,但我从未使用过 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 的测试实例,所以如果您遇到一些小的语法错误,请尝试自己修复它们(以便您更快地获得解决方案)。如果您无法弄清楚查询在做什么,请告诉我
推荐阅读
- reactjs - 如何从材料 ui 提交自动完成的值?
- pine-script - Metastock 脚本到 Pine (Tradingview)
- c++ - [decl.constexpr].5 到底是什么意思?
- discord - Discord Bot UnhandledPromiseRejectionWarning:TypeError:generalChannel.send 不是函数
- excel - VBA打印循环没有将整个循环写入批处理文件
- c# - 在不同的单元格值之间插入行
- markdown - 块引号未在 readme.md 中正确呈现
- google-sheets - 谷歌工作表从多个工作表导入给出错误
- android - Android中的@PrimaryKey注释字段不被视为单独的字段吗?
- r - 网页在浏览器中工作,但不是来自 R:SSL 证书问题:证书已过期