SELECT case WHEN (LOCATE('nocheck', d.VALUE) > 0 && FORMAT(SUM(G.total_amount2023), 2) is NOT null) || (d.VALUE = '' && (FORMAT(SUM(G.total_amount2023), 2) is NOT null)) then FORMAT(SUM(G.total_amount2023), 2) when d.VALUE is null && FORMAT(SUM(G.total_amount2023), 2) is null then '' else d.VALUE end as total_amount2023 FROM (SELECT FORMAT(SUM(T.total_amount), 2) AS total_amount2023,T.approve_result_uuid FROM ( SELECT CASE WHEN LOCATE('nocheck', a. VALUE) > 0 THEN 0 ELSE REPLACE (a. VALUE, ',', '') END AS total_amount,a.approve_result_uuid FROM ar_approve_entry_result a WHERE entry_UUID IN ('AREN1299', 'AREN1733401') AND approve_result_uuid = ( SELECT uuid FROM ar_approve_result WHERE pay_comfirm_uuid = ? AND sys_status = 1 ORDER BY datetime DESC LIMIT 0, 1 ) ) T)G RIGHT JOIN ar_approve_entry_result d on d.approve_result_uuid = G.approve_result_uuid WHERE d.entry_uuid = 'AREN1272' and d.approve_result_uuid = ( SELECT uuid FROM ar_approve_result WHERE pay_comfirm_uuid = ? AND sys_status = 1 ORDER BY datetime DESC LIMIT 0, 1 ); 分析这个sql: 首先业务要求:补充金额有录入值时,将补充金额加订单-合计金额,代替订单合计金额进行比对 规则 要求: 优先级: 进度款申请书 节点中:甲乙双方确认最终审定结算造价 > 采筑订单截图(PDC订单) 节点中:合计金额 + 补充金额 这个sql 的写法: 首先从整体上来讲思路: 1.把 [采筑订单截图(PDC订单) 节点中:合计金额 + 补充金额] 这个点看成一个整体 G与[甲乙双方确认最终审定结算造价]这个点看成是一个整体D, 使用了 RIGHT JOIN ,以D 表为基准,在这里D表的数据是一定有的,所以 用了 右连接 2.分析 G 这个子查询整体,这个整体主要查询了,采筑订单截图(PDC订单) 节点中:合计金额 + 补充金额 ,用了 sum 来求和 ,用in 来查询2个 录入项值,REPLACE (a. VALUE, ',', '') 这个的作用a. VALUE 的值是金额,假设是这样的话,100,560,120 就得转换一下用值中的逗号,替换为空, LOCATE('nocheck', a. VALUE)>0 如果是这样子的,意思是说,a.VALUE 的值 为 nocheck 的时候,我们就把当前的结果设为0,进入计算。 FORMAT(SUM(T.total_amount), 2) AS total_amount2023 这 个是求和,因为结果是多条的,所以用sum 求和下。FORMAT(XX,2)格式化数据,只要2位。 3.分析d 表,关键在于 where 的后面用了 d.entry_uuid = 'AREN1272' 这个条件,是要和符合这个条件的数据,因为是以这个表 为基准的(主表) 4.分析查询结果select部分 case WHEN (LOCATE('nocheck', d.VALUE) > 0 && FORMAT(SUM(G.total_amount2023), 2) is NOT null) || (d.VALUE = '' && (FORMAT(SUM(G.total_amount2023), 2) is NOT null)) then FORMAT(SUM(G.total_amount2023), 2) when d.VALUE is null && FORMAT(SUM(G.total_amount2023), 2) is null then '' else d.VALUE end as total_amount2023 这里的 注意点: 业务要求是,取值的优先级:甲乙双方确认最终审定结算造价 > 所有[合计金额 + 补充金额] 1.case when 机制 ,和if else 一样,在这里 第一步要先判断 d.value 是否有值 ,然后 在 判断 合计金额是否有值,然后在判断 2个都没有值