为深入贯彻落实胡泽君审计长沙巴体育平台:“科技强审”的指示要求,郑州市审计局驻洛阳市环境污染治理审计组,围绕“揭示问题、服务决策、全面整改、完善机制、规范管理、促进发展”的目标任务和原则,积极探索大数据环境下的审计监督能力,全面提升审计质量和工作效率。
近日,在本次环保审计中,发现被审单位提供的EXCEL表格数据,有时存在列数值填充不完整的现象,尤其是某列数据下一行与上一行数值相同时就不填写,如:财政部门提供的财政供养人员信息表中(3万多行),单位名称列仅该单位的第一行填写,其余行不再填写,如图1所示:
(图1)
然而我们在数据表进行分析比对处理过程中,尤其是数据处理结果须每一行都显示所缺省的值,这就需要对每一行缺省的数据进行填充,如果在几万行数据的EXCEL表中直接填写不仅费时费力,还容易出错,在此介绍两种在SQL Server数据库自动填充数据的方法,供大家参考:
一、利用SQL Server公用表表达式(CTE)实现自动填充
表表达式是一种命名的查询表达式,代表一个有效的关系表。可以像其他表一样,在数据处理语句中使用表表达式。SQL Server支持4种类型的表表达式:派生表(derived table)、公用表表达式(CTE,common table expression)、视图以及内联表值函数(inline TVF,inline table-valued function)。这里我们利用公用表表达式(CTE,common table expression)对某财政单位提供的财政供养人员名册中缺失的单位名称列进行自动填充,具体实现过程如下:
步骤一、在SQL Server查询管理器中撰写语句下列,显示填充前后对比:
with bbds as
(select 序号,单位名称 from 财政供养人员2017 where 单位名称 is not null
union all
select 财政供养人员2017.序号,bbds.单位名称
from bbds
inner join 财政供养人员2017
on bbds.序号=财政供养人员2017.序号-1
where 财政供养人员2017.单位名称 is null)
select *
from bbds
order by 序号
OPTION(MAXRECURSION 0)
执行结果如图2所示:
(图2)
步骤二:将单位名称填充后的结果保存为表“财政供养人员填充2017” ,sql语句如下:
with bbds as
(select 序号,单位名称 from 市级财政供养人员2017 where 单位名称 is not null
union all
select 市级财政供养人员2017.序号,bbds.单位名称
from bbds
inner join 市级财政供养人员2017
on bbds.序号=市级财政供养人员2017.序号-1
where 市级财政供养人员2017.单位名称 is null)
select *
into 市级财政供养人员2017填充 from bbds
order by 序号
OPTION(MAXRECURSION 0)
步骤三:关联表 ‘财政供养人员2017’和‘财政供养人员2017填充’,生成完整的财政供养人员名册
SELECT a.[序号],b.[单位名称],[姓名],[身份证号码],[行政职务],[年度] FROM [洛阳环保审计].[dbo].[市级财政供养人员2017] a left join 市级财政供养人员2017填充 b on a.序号=b.序号
执行结果如图3所示:
(图3)
二、利用游标实现字段值的自动填充
SQL的游标是一种临时的数据库对象,即可以用来存放在数据库表中的数据行副本,是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。也可以指向存储在数据库中的数据行的指针。同时,游标实际上游标充当指针的作用,提供了在逐行的基础上操作表中数据的方法。这里我们利用SQL游标对某财政单位提供的财政供养人员名册中缺失的单位名称列进行自动填充,具体实现过程如下:
步骤一:创建表‘市级财政供养人员2017处理’,用以生成最终填充后的表,撰写SQL语句:
CREATE TABLE 市级财政供养人员2017处理(
序号 [float] NULL,
单位名称保留 [nvarchar](255) NULL,
[单位名称] [nvarchar](255) NULL,
[身份证号码] [nvarchar](255) NULL,
[姓名] [nvarchar](255) NULL,
[行政职务] [nvarchar](255) NULL,
[年度] [nvarchar](255) NULL
)
步骤二:撰写游标,从‘市级财政供养人员2017’ 逐行读出数据,判断其字段‘单位名称’的值是否为空,如果不为空就记录当前值,并用当前值依次填充下一行为空的单位名称字段的值,至到下一行单位名称的值不为空为止。
declare @序号 [float]
declare @单位名称保留 varchar(255)
declare @单位名称 varchar(255)
declare @身份证号码 varchar(64)
declare @姓名 varchar(64)
declare @性别 varchar(64)
declare @行政职务 varchar(64)
declare @年度 varchar(255)
declare cursor1 cursor for
SELECT 序号,单位名称,身份证号码,姓名,行政职务,年度 FROM 市级财政供养人员2017
open cursor1
fetch next from cursor1 into @序号,@单位名称,@身份证号码,@姓名,@行政职务,@年度
while @@fetch_status=0
begin
if @单位名称 is not null set @单位名称保留=@单位名称
INSERT INTO 市级财政供养人员2017处理
(序号,单位名称,身份证号码,姓名,行政职务,年度)
VALUES
(@序号,@单位名称保留,@身份证号码,@姓名,@行政职务,@年度)
fetch next from cursor1 into @序号,@单位名称,@身份证号码,@姓名,@行政职务,@年度
end
close cursor1
deallocate cursor1
步骤三:删除无效记录
单位在提供财政供养人员表(Excel)时,表中往往含有‘小计’、‘总计’等无效记录,为了加快数据在使用过程中的处理速度,需要将这些无效记录删除。
delete FROM [洛阳环保审计].[dbo].[市级财政供养人员2017处理] where 身份证号码 is NULL
执行结果如图4所示:实现了自动填充字段值的目的。
(图4)
(信息中心 时占停 )