运用T-SQL语句查询分析应注意的几个方面
2016-11-10赖春林
■赖春林
运用T-SQL语句查询分析应注意的几个方面
■赖春林
如今的审计实务中,越来越多地运用了T-SQL语句进行数据的查询分析。尤其是这次全国医疗保险基金审计,海量的数据采集整理完毕之后,接下来就需要利用结构化查询语句做对比分析,生成审计疑点。T-SQL语句就是常见的一种结构化查询语句。正确的思路和算法才能得出更准确的疑点。思路或算法若出现错误,将导致现场审计人员和被审计单位核对不精确“疑点”所耗费的人力财力物力增加,无效工作时间变长。
鉴于对T-SQL语句的依赖越来越强,有必要对计算机审计思路和T-SQL语句的语法加强学习。本文将在采集的数据基本无误且通过了校验整理的大前提下,总结此次医保审计以来,从数据分析的思路和算法实现上容易出错的几个地方。
一、思路不缜密
在得出一个审计疑点之前,审计人员在对相关法律法规理解之后,才能做到审计思路缜密、条理清晰且在算法上可实现。应注意以下几个方面:
(一)正确选取筛查对象
1.查询欠缴或缴费不足情况时,需要比对有减免优惠政策的数据,对可以享受减免优惠政策的人员应按照享受期间予对应缴额以核减。
2.查询一人多卡(重复参保)情况时,应排除转保、挂失等正常情况,筛查疑点数据需要检验一人多卡的每张卡使用期间是否重叠,卡的状态是否正常。
3.查询挂床住院人数情况时,需要考虑存在非医保参保人员住院情况,因此应以医院HIS系统住院数据为准,医保数据作为参照。
4.各种费用的统计或筛查,需要考虑是否存在退费的情况,若存在,需要进行排除。
5.判断参保人员死亡,需要考虑是以医院数据为准,还是以民政殡葬数据或公安数据为准,此处具体问题需要具体对待。
(二)唯一标识实体字段
我们知道个人实体可以用身份证号码作为唯一标识字段,那么单位实体呢?如标识同一家医院,该医院可以在不同时期有不同行政区划所属、不同名称、不同等级,名称有全称及不同版本的简称,医院码也无统一标准,所以此处应采用相对统一、稳定的组织机构代码(统一社会信用代码)作为标识,更为可靠。
(三)注意时段性数据
这些数据在不同的时间,状态可能发生变化,如个人婚姻状态、个人或家庭低保状态、医院床位数、人员所属单位、人员参保状态、单位所在地等等。这些情况在思考审计思路时应注意加以区别。
二、算法不严谨
正确的审计思路提出来后,就要靠严谨的算法来准确无误地实现思路。应避免以下几种情况:
(一)内连接忽略的数据
表连接查询分内连接、左(右)连接和全连接,三种连接方式表达的意思不同,出现的结果也未必相同。但语法上不报错,故而很容易忽略掉一些数据。例如要查询100个已知身份证号的个人的缴费情况,如果用“个人应缴实缴明细”与“个人基本信息表”以“身份证号”做内连接,结果可能只查询到小于100的人数的缴费情况。
(二)条件语句写错
1.条件区间是开区间、闭区间,还是半开半闭区间,不同的条件影响不同的结果,重复的区间可能造成重复的数据。
2.多条件之间是用“与”还是“或”连接。哪些条件先与再或,哪些条件先或再与,若分不清“与或非”的运算顺序,建议使用小括号强制提高优先级。
三、语法不熟练
算法合理之后,就需要对T-SQL语句的语法熟练,才能真正的写出正确的算法。应注意以下几点:
(一)误操作丢失数据
1.数据导入时候,因字段类型原因或者原始数据的实际值与导入字段类型不匹配的原因,容易导致的数据丢失或失真。所以在导数据前,要仔细检查原始数据的值有没有不正常的,检查要导入的字段类型设置是否符合原始数据需要,符合查询运算需要,符合逻辑定义。
2.删除重要数据之前必须先备份,要养成不在原始数据上操作的习惯。
3.允许多用户连接数据库服务器的时候,要按照需要设置权限控制,尽量少给权限,尤其注意少开放增删改的权限。
(二)Null值参与运算造成的分析结果错误
T-SQL语句语法规定,算数表达式、字符表达式和日期表达式中若存在Null值参与运算,结果即为Null;逻辑表达式中若存在Null值参与运算,结果即为假。因此我们在实际运用当中,要注意避免这些情况,可以利用IsNull()函数来替代运算中碰到的Null值。
(三)数据类型与运算符不匹配造成的分析结果错误
当需要用到OrderBy子句对查询结果排序的时候,若排序字段是字符型的数字,就要特别注意,“10”比“2”升序排序时更靠前。
(四)超出数据类型取值范围造成的分析结果错误
SQL Server中,相同数据类型大类里有多种不同的小类,其取值范围是有差异的。如日期时间类型中的date型、datetime型、smalldatetime型、datetime2型等,其取值范围日期部分分别是“0000-01-01到9999-12-31”、“1753-01-01到9999-12-31”、“1900-01-01到2079-06-06”、“0000-01-01到9999-12-31”。在它们之间进行类型转换、数据值运算时就要注意因超出取值范围而影响查询结果的问题。
(五)去重(不去重)造成的分析结果错误
一般而言,统计次数时,Count函数不需要加Distinct去重,而统计个数时,需要加Distinct去重。实际工作中应具体对待。同时还要注意Count函数的参数如果是具体字段时,会忽略Null值。
以上是笔者在此次医保审计数据采集、数据整理、数据分析中遇到过的问题,为了尽量避免出现以上问题,需要我们多思考、多学习,不怕麻烦不怕累,逻辑推理要缜密,计算方法要严谨和语法运用要熟练。
(作者单位:南昌市审计局)