sql 分析2

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个都没有值
原文地址:https://www.cnblogs.com/xiaoniuniu886/p/12107937.html