php - PHP 计算具有复杂标准的数据
问题描述
我有一个名为tblDueDetails的表,其中包含我的客户的所有到期详细信息。
这是我的桌子:
- Loanno(字符)
- DueDate(日期)
- 到期代码(字符)
- StartDT(日期)
- EndDT(日期)
- DueAMT(双)
- DuePD(双)
这是我到目前为止制作的代码:
$duesquery = "SELECT DUEDT, DUECD, STARTDT, ENDDT, DUEAMT, DUEPD FROM LLDUEDET WHERE LOANNO = '". $loanno ."' AND DUEAMT != DUEPD";
$duessql = oci_parse($conn, $duesquery);
$duesexec = oci_execute($duessql);
if($duesexec){
while($duesrow = oci_fetch_assoc($duessql)){
$table .= '
<tr>
<td>'. date('m/d/Y', strtotime($duesrow['DUEDT'])) .'</td>
<td>'. trim($duesrow['DUECD']) .'</td>
<td>'. date('m/d/Y', strtotime($duesrow['STARTDT'])) .'</td>
<td>'. date('m/d/Y', strtotime($duesrow['ENDDT'])) .'</td>
<td>'. number_format(trim($duesrow['DUEAMT']), 2) .'</td>
<td>'. number_format(trim($duesrow['DUEPD']), 2) .'</td>
</tr>';
}
}
这是我的解释: - 当DUEMT不等于DUEPD
时,我需要获取所有数据。
- 但是每次有一个DUECD等于 ' PRI ' 和 ' INT ' 返回时,我需要通过添加PRI的DUEAMT和INT的DUEAMT来计算PENALTY(请参阅表格)
我上面的 SQL 的输出:
Due Date | Due | Start Date | End Date | Due Amount | Due Paid
11/30/2019 PRI 10/30/2019 11/30/2019 19,546.62 0.00
11/30/2019 INT 10/30/2019 11/30/2019 10,808.38 1,062.86
11/30/2019 PEN 10/30/2019 11/30/2019 1,500.00 1,500.00
------- Insert Penalty Row Here ---------
12/30/2019 PRI 11/30/2020 12/30/2019 20,158.62 0.00
12/30/2019 INT 11/30/2020 12/30/2019 11,498.38 3,212.46
------- Insert Penalty Row Here ---------
1/03/2020 CCF 01/03/2020 01/03/2020 200.00 0.00
01/03/2020 CFR 01/03/2020 01/03/2020 729.17 0.00
我的问题是当返回数据DUECD = PRI和IND时如何计算每个PENALTY
解决方案
这样的事情应该可以工作(您可以更改子查询中的惩罚计算):
我假设只有在 PRI
和INT
记录都存在的情况下才需要计算惩罚。如果此假设不正确,并且您需要在其中一个或记录存在时计算惩罚, PRI
您INT
可以having count(*) = 2
从下面的查询中删除 。
select LOANNO, DUEDT, DUECD, STARTDT, ENDDT, DUEAMT, DUEPD
from
(
SELECT LOANNO, DUEDT, DUECD, STARTDT, ENDDT, DUEAMT, DUEPD
, case
when DUECD = 'PRI' then 1
when DUECD = 'INT' then 2
else 10
end ord
FROM LLDUEDET
WHERE DUEAMT != DUEPD
union all
select pc.LOANNO, pc.DUEDT, pc.DUECD, pc.STARTDT, pc.ENDDT, pc.DUEAMT, coalesce(pa.DUEPD, 0.0) DUEPD
,3 ord
from (
select LOANNO, DUEDT, 'PEN' DUECD, STARTDT, ENDDT, ((SUM(DUEAMT)-SUM(DUEPD)) * 30) * .1 DUEAMT
from LLDUEDET
WHERE DUEAMT != DUEPD
and DUECD in ('PRI', 'INT')
group by LOANNO, DUEDT, STARTDT, ENDDT
having count(*) = 2
) pc
left join (
select LOANNO, DUEDT, SUM(DUEPD) DUEPD
from LLDUEDET
where DUECD = 'PEN'
group by LOANNO, DUEDT
) pa on pa.loanno = pc.loanno and pa.duedt = pc.duedt
) s
order by LOANNO, DUEDT, ord
推荐阅读
- maxima - 如何在最大值 [v5.44] 中更改线条的线条粗细(implicit_plot)?
- c# - 如何将数组 [] 转换为 HttpPostedFileBase
- android - 在recyclerview kotlin中插入firebase快照
- spring - 如何在论坛项目中实现类似的功能 [spring-boot]
- python - 将控制过滤器添加到 Plotly 条形图
- matlab-figure - 序数变量 corrplot 的替代方法
- python - 我需要一些帮助来使用 Spyder 设置带有 Celeb_a 数据集的 Keras-Tuner
- java - 将 ASCII 数值转换为字符
- coinbase-api - Coinbase Pro API 传输端点上缺少货币字段
- python - 如何使用python获取anki卡的渲染html