mysql - 需要一个聚合的 MySQL 选择,它几乎可以跨日期范围迭代并返回账单
问题描述
我有一个名为 rbsess 的 MySQL 表,其中包含列 RBSessID (key)、ClientID (int)、RBUnitID (int)、RentAmt (fixed-point int)、RBSessStart (DateTime) 和 PrevID (int,对 RBSessID 的引用)。
它不是事务性的或链接的。当客户搬进房间时,它会跟踪什么,以及搬入时的租金是多少。查找特定客户在特定日期的租金是多少的查询是:
SET @DT='Desired date/time'
SET @ClientID=Desired client id
SELECT a.RBSessID
, a.ClientID
, a.RBUnitID
, a.RentAmt
, a.RBSessStart
, b.RBSessStart AS RBSessEnd
, a.PrevID
FROM rbsess a
LEFT
JOIN rbsess b
ON b.PrevID=a.RBSessID
WHERE a.ClientID=@ClientID
AND (a.RBSessStart<=@DT OR a.RBSessStart IS NULL)
AND (b.RBSessStart>@DT OR b.RBSessStart IS NULL);
这将输出如下内容:
+----------+----------+----------+---------+---------------------+-----------+--------+
| RBSessID | ClientID | RBUnitID | RentAmt | RBSessStart | RBSessEnd | PrevID |
+----------+----------+----------+---------+---------------------+-----------+--------+
| 2 | 4 | 1 | 57500 | 2020-11-22 00:00:00 | NULL | 1 |
+----------+----------+----------+---------+---------------------+-----------+--------+
我也有
SELECT * FROM rbsess WHERE rbsess.ClientID=@ClientID AND rbsess.PrevID IS NULL; //for finding the first move in date
SELECT TIMESTAMPDIFF(DAY,@DT,LAST_DAY(@DT)) AS CountDays; //for finding the number of days until the end of the month
SELECT DAY(LAST_DAY(@DT)) AS MaxDays; //for finding the number of days in the month
SELECT (TIMESTAMPDIFF(DAY,@DT,LAST_DAY(@DT))+1)/DAY(LAST_DAY(@DT)) AS ProRateRatio; //for finding the ratio to calculate the pro-rated rent for the move-in month
SELECT ROUND(40000*(SELECT (TIMESTAMPDIFF(DAY,@DT,LAST_DAY(@DT))+1)/DAY(LAST_DAY(@DT)) AS ProRateRatio)) AS ProRatedRent; //for finding a pro-rated rent amount based on a rent amount.
我无法将所有这些放在一起以形成一个查询,该查询可以根据开始日期和可选的结束日期输出按比例计算的全部租金金额,并在该期间每个月的单个报表中输出所有欠租金额。我可以添加收到的付款表并在之后将其集成,只是很难在 MySQL 查询中使用这个看似简单的现实世界概念。我正在使用带有 MySQL 后端的 php。临时表作为中间查询是完全可以接受的。
即使是轻推也会有帮助。我对 MySQL 查询没有超级经验,只是基本的 CREATE、SELECT、INSERT、DROP 和 UPDATE。
GMB 要求的示例:
//Example data in rbsess table:
+----------+----------+----------+---------+---------------------+--------+
| RBSessID | ClientID | RBUnitID | RentAmt | RBSessStart | PrevID |
+----------+----------+----------+---------+---------------------+--------+
| 1 | 4 | 1 | 40000 | 2020-10-22 00:00:00 | NULL |
| 2 | 4 | 1 | 57500 | 2020-11-22 00:00:00 | 1 |
| 3 | 2 | 5 | 40000 | 2020-11-29 00:00:00 | NULL |
+----------+----------+----------+---------+---------------------+--------+
预期结果将是每月欠租金额的清单,包括一个月内部分入住的按比例分摊的金额,从几个月的日期范围开始。例如,对于上面的示例数据,来自 ClientID=4 的客户的跨越 2020 年全年的日期范围,查询将在类似于以下的范围内生成每个月的金额:
Month | Amt
2020-10-1 | 12903
2020-11-1 | 45834
2020-12-1 | 57500
解决方案
推荐阅读
- python - 为什么在类上设置描述符会覆盖描述符?
- java - 使用 Swagger 将创建的日期时间添加到 REST API
- bootstrap-4 - 如何在不更改列宽的情况下将输入字段放在表头上?
- r - 从R中的data.frames列表中提取?
- c - 二叉搜索树的层序遍历
- excel - Excel VBA WorksheetFunction 是否需要使用选择才能在正确的工作表上
- typescript - 如何将 GraphQL 与 TypeScript 和从 graphql-code-generator 生成的类型一起使用?
- excel - VBA Excel:获取多个选项卡并输出为单个 Word 文档
- biginteger - AWS Athena:处理大数字
- javascript - 在 src 中附加 window.location