2016年12月,安徽省对县区全面开展财政专项扶贫资金专项审计调查,其中一项审计内容就是扶贫信息的精准化。由于地方各级审计机关无法获取到扶贫信息服务器数据,只能从客户端取得EXCEL格式的数据,其数据排列方式如下图:
表中行号2至4系同一家庭,其户主行号为2,排在该户家庭的首位,其他家庭成员的排列方式与此相同,这种顺序是由系统导出时决定的。 通过SQL SERVER导入向导,将EXCEL数据导入到指定的数据库,因集合是无序的,故不能保证数据按原来的顺序存储。因此在导入之前,需要加上一列序号,以区分记录的顺序。导入后,就可以按顺序输出查询。下图导入到SQL SERVER数据库后的简略格式:
扶贫人员基本信息表应与其他数据源关联分析,如村干部信息表、财政供养人员信息表、工商注册信息表、行驶证信息表、商品房交易明细表等。如果扶贫基本信息表中存在上述人员,则整个家庭成员有可能不具备建档立卡资格。如上表序号4至7为同一家庭,如果序号6在商品房交易中有购房记录,则整个家庭成员均不应列入扶贫对象,应作为审计疑点,延伸审查。 由其中1名家庭成员疑点扩大到整个家庭,就需要对数据进行分组,即相同的家庭成员为一组,如果家庭成员其中之一不符合建档立卡标准,进而将整个家庭成员视为疑点。问题的关键是如何将扶贫家庭分组,分组的标志又是什么呢?从上表的数据排列方式可以看出,每个家庭都有户主(1人家庭,户主即为本人),因此可以将户主的证件号码作为每个家庭的分组标志。 SELECT序号 ,证件号码 ,与户主关系 ,(SELECT证件号码 FROM模拟数据 WHERE序号=(SELECT MAX(序号) FROM模拟数据mm WHERE mm.序号<=m.序号 AND mm.与户主关系='户主'))AS户主证件号码 FROM模拟数据m: 执行结果如下:
语句分析:本例采用相关子查询实现,外部主查询查询模拟数据表中的每一条记录,主列表中的子查询将返回“户主关系”为“户主”,且取小于等于当前序号的最大序号。如: 针对序号6,外部查询返回序号6的记录,主列表中的子查询则获取小于或等于序号6,且为户主的序号,即1与4,然后取其最大值,结果是序号4的证件号码,对于序号1至10,每次都需要作类似的查询。 以上代码在SQL SERVER、ORACLE、ACCESS等数据库均可运行。 SELECT序号 ,证件号码 ,与户主关系 ,(SELECT TOP(1)证件号码 FROM模拟数据mm WHERE mm.序号<=m.序号 AND mm.与户主关系='户主' ORDER BY序号DESC)户主证件号码 FROM模拟数据m: 执行结果与上述相同。 语法分析:外部主查询针对返回的每条记录,内部查询取得小于或等于外部序号的记录,并且“与户关系”为“户主”的全部序号,然后按序号降序排列,即获得最大值序号的证件号码。 这种方法为SQL SERVER所独有,相比解一,它具备更好的性能。 ——UDF解决方案 CREATE FUNCTION fn_ GetMaID(@n INT,@xh INT) RETURNS TABLE WITH SCHEMABINDING ——绑定数据表 RETURN SELECT TOP(@n)证件号码AS户主证件号码 FROM dbo.模拟数据WHERE序号<=@xh AND与户主关系='户主' ORDER BY序号DESC; SELECT m.序号 ,m.姓名 ,m.证件号码 ,m.与户主关系 ,m.人数 ,v.户主证件号码 FROM模拟数据m CROSS APPLY dbo.fn_GetMaID(1,m.序号)v; 分析:先定义一个用户自定义函数(UDF),返回“与户主关系”为“户主”、序号小于指定值、并按序号降序排列,取前n项证件号码的表值函数,函数中使用了“WITH SCHEMABINDING”选项,是为了将函数与数据绑定,以防止架构的更改,导致函数失效。在查询语句中,使用APPLY语法,对于来源于模拟数据表中每一行,UDF计算引用该表(左表)中每个序号,获得大于或等于左表序号、且“与户关系”为“户主”的记录,然后按序号降序排列,取第一条记录。