cl_proc后面的值当中包含/*,*/注释符号,mysql去解析的时候,触发bug,原本包含在‘’中字符串含义发生变化,导致语句报错。(但是我在mysql查询分析器,怎么样都模拟不出来这种错误,就是偶然发生)。
解决方法:将/*注释符号替换为其他字符即可,比如”--”,让其不触发解析注释串。
问题三:联网医保金额与本地程序计算,有少数患者偶尔会存在金额不一致问题。翻看程序代码左看右看,都没有问题,如下所示。
lc_jine_sum = round(tab_1.tabpage_1.dw_1.getitemnumber(1,"jine_total"),2)
问题原因:我突然想起一个基础知识,计算机浮点数本身是不准确的,每次运算都有可能得出不同的结果,既然不准确,为什么我们还会大规模使用计算机来解决问题,解决方法就是提高计算机处理精度,让它无限逼近准确。什么意思,我们大部分现实当中,大部分都是计算到2位小数,最多也是4位小数,但是计算机就无所谓,10-20位都可以处理,10-20位小数精度再截取2-4位小数,当然就可以做到准确无误。大家是否遇到过这种问题,明明只有一位小数,把这些数字加起来的时候,你会看到一长串小数,这就是计算机内部使用高精度计算的问题,如下图所示。
计算机内部使用高精度的小数(一般是10几位以上),来解决小数不准确的问题。所以我当时就把代码改了一下,果然改完以后,问题从此没有出现过。这就是利用基础知识去解决实际当中的难题,你看得我写的很简单,其实想到这个方法是非常困难的。
三、解决一个sql问题基本思路lc_jine_sum =round(tab_1.tabpage_1.dw_1.getitemnumber(1,"jine_total"),4) //先取出 4 位小数
lc_jine_sum = round(lc_jine_sum,2) //再进行 2 位小数四舍五入
日常工作sql语句主要用途,临时统计数据、后台查数找问题原因、制作报表。拿到一个sql语句的问题首先我们先从业务角度分析,后台是否存在数据,它们是否存在相应关联?没有数据,没有关联,后继工作毫无意义。
举例说明,患者用药追踪,统计患者用了哪个厂家哪个批次的药品。统计的意义,如果发药哪个批次有问题,可以精准找到相关患者。第一个问题,后台有数据吗,有的。his里面基本上都有药品出入库、患者用药数据,但是药品管理的厂家、批次,与患者用药之间没有关联。这也是his系统里面的一个难题,目前我还没有看到靠谱的解决方案。由上述可以得知,患者用药追踪,这个问题无法用sql解决。
其次,通常你拿到一个稍微复杂sql问题一般不能一步到位写出来。别操之过急,学会化解问题。举例说明,统计历史连续某段时间内每日在院人数,假设his系统中没有生成数据(每天将在院人数数据拷贝生成一个中间表数据)。
第一步分解:假设你现在统计历史某日(2020-03-01)的在院人数,在院人数 = (入院日期 <= 在院人数 <= 出院日期) 一直未出院的在院人数。
第二步分解:模拟生成连续某段时间,比如2020-03月份,再关联生成每日在院人数
最后,需要验证统计出来的数据是否正确,经过验证,统计出来的历史在院数据是完全正确的,发现有个别出现1,2个人的误差,是因为人为修改了”入院日期“,”出院日期“所致,如果你想检验sql水平怎么样,我给你一个判断标准,是否使用了中间表。严格来说,只要数据库存在数据,存在关联,就可以用sql语句查出来,如果你精通sql是不会用到中间表的。
四、SQL基础理论知识掌握基础理论知识是成为SQL高手第一步,我不会照搬教科书式的讲课,我只会讲解我认为你最应该的掌握的3个知识点。
1、集合(Set)。我给大家一个简单的概念,sql里面一切皆集合。SQL 以关系代数为基础发展出来的一门语言,关系代数主要是“集合”。
sql语句形式:select .... from ....
集合在sql当中的表现形式:每一个select语句都是一个集合,写在from后面的每个表、子查询、视图可以算作一个集合。