具有复杂条件的 PHP 计算数据

我有一个名为tblDueDetails的表,其中包含我的客户的所有到期详细信息。

这是我的表格:

  • 洛安诺(查尔)

  • 到期日期(日期)

  • DueCode(字符)

  • 启动(日期)

  • 结束时间 (日期)

  • DueAMT (Double)

  • DuePD (Double)

以下是我到目前为止制作的代码:

$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>';

    }

}

这是我的解释:

- 当 DUEAMT 不等于 DUEPD 时,我需要获取所有数据。

- 但是,每次有一个DUEKD等于“PRI”和返回“INT”时,我需要通过添加PRI的DUEMT和INT的DUEMT来计算惩罚(请参阅表格)


上面我的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 时,如何计算每个惩罚


蝴蝶刀刀
浏览 140回答 1
1回答

森林海

类似这样的东西应该有效(您可以在子查询中更改惩罚计算):我假设只有当两者都存在并且存在记录时,才需要计算罚款。如果此假设不正确,并且您需要计算惩罚(如果存在任何一条或记录),则可以从下面的查询中删除 。PRIINTPRIINThaving count(*) = 2DB 小提琴演示select LOANNO, DUEDT, DUECD, STARTDT, ENDDT, DUEAMT, DUEPDfrom(&nbsp; SELECT LOANNO, DUEDT, DUECD, STARTDT, ENDDT, DUEAMT, DUEPD&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;, case&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; when DUECD = 'PRI' then 1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; when DUECD = 'INT' then 2&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else 10&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end ord&nbsp; FROM LLDUEDET&nbsp; WHERE DUEAMT != DUEPD&nbsp; &nbsp;union all&nbsp; select pc.LOANNO, pc.DUEDT, pc.DUECD, pc.STARTDT, pc.ENDDT, pc.DUEAMT, coalesce(pa.DUEPD, 0.0) DUEPD&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;,3 ord&nbsp; from (&nbsp; &nbsp; select LOANNO, DUEDT, 'PEN' DUECD, STARTDT, ENDDT, ((SUM(DUEAMT)-SUM(DUEPD)) * 30) * .1 DUEAMT&nbsp; &nbsp; from LLDUEDET&nbsp; &nbsp; WHERE DUEAMT != DUEPD&nbsp; &nbsp; and DUECD in ('PRI', 'INT')&nbsp; &nbsp; group by LOANNO, DUEDT, STARTDT, ENDDT&nbsp; &nbsp; having count(*) = 2&nbsp; ) pc&nbsp; left join (&nbsp; &nbsp; select LOANNO, DUEDT, SUM(DUEPD) DUEPD&nbsp; &nbsp; from LLDUEDET&nbsp; &nbsp; where DUECD&nbsp; = 'PEN'&nbsp; &nbsp; group by LOANNO, DUEDT&nbsp; ) pa on pa.loanno = pc.loanno and pa.duedt = pc.duedt) sorder by LOANNO, DUEDT, ord
打开App,查看更多内容
随时随地看视频慕课网APP