zoukankan      html  css  js  c++  java
  • 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个都没有值
  • 相关阅读:
    最大生成树与最小生成树
    有限制的最短路spfa+优先队列
    KM算法(最优匹配)
    网络最大流解方程组
    网络费用流-最小k路径覆盖
    树链剖分-点的分治(点数为k且距离最长的点对)
    树链剖分-点的分治(链的点的个数为k的点对数)
    树链剖分-点的分治(dis[i]+dis[j]==k的点对数量)
    树链剖分-点的分治(dis[i]+dis[j]<=k的点对数量)
    无向图欧拉通路
  • 原文地址:https://www.cnblogs.com/xiaoniuniu886/p/12107937.html
Copyright © 2011-2022 走看看