需要一个聚合 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,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,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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?