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个都没有值