为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
蝴蝶刀刀 2022-08-19 15:16:17
我有一个名为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.0011/30/2019    INT      10/30/2019     11/30/2019    10,808.38       1,062.8611/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.0012/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.0001/03/2020    CFR      01/03/2020     01/03/2020    729.17          0.00我的问题是,当返回数据 DUECD = PRI 和 IND 时,如何计算每个惩罚
查看完整描述

1 回答

?
森林海

TA贡献2011条经验 获得超2个赞

类似这样的东西应该有效(您可以在子查询中更改惩罚计算):

我假设只有当两者都存在并且存在记录时,才需要计算罚款。如果此假设不正确,并且您需要计算惩罚(如果存在任何一条或记录),则可以从下面的查询中删除 。PRIINTPRIINThaving count(*) = 2

DB 小提琴演示

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


查看完整回答
反对 回复 2022-08-19
  • 1 回答
  • 0 关注
  • 139 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信