基于postgresSQL的数据核查方案-一种基于OOSE方法

最近基于postgresSQL的游标和临时表方案开发了一个数据完整率的核查工具。

5 SQL摘要
1、向result_table记录分vendor_name的记录总数
sql := 'insert into '||result_table||' (时间,vendor_name,记录总数)
select 时间,厂家名称,count(*) from '|| check_table || ' where 时间=' || '''' || time || '''' || ' group by  时间,厂家名称 ';

EXECUTE sql;

2、提取check_table表的所有字段名,存入tmp_check_col
sql := 'create temp table tmp_check_col as  SELECT a.attname
            FROM pg_class as c,pg_attribute as a
        where c.relname = '''||check_table||''' and a.attrelid = c.oid and a.attnum>0
        and a.attname not in ( ' ||''''||'时间'||''''||' ) ';

EXECUTE sql;

3、打开游标
        open datcheck_C   FOR
            SELECT  attname  from  tmp_check_col ;

4、读取游标,并循环逐个读出字段名
        FETCH datcheck_C INTO colname ;
        while (colname.attname is not null) loop 
       
5、循环体内,计算为空记录数 [num] 除以 步骤1中的记录总,得到 某字段的缺失率,并更新到对应的单元格内       
sql := 'update '||result_table||' b set '||colname.attname||'=(SELECT round(a.num::numeric/b.记录总数::numeric,4)  FROM  
        (
        select  时间,厂家名称,count(*) as num from '||check_table||'  where '||colname.attname||' is not null and 时间 ='''||time||''' group by 时间, 厂家名称
        ) a
       WHERE a.时间=b.时间  and a.厂家名称=b.vendor_name) where 时间='''||time||'''';

EXECUTE sql;
      
sql := 'update '||result_table||' set '||colname.attname||' =0 where 时间='''||time||''' and '||colname.attname||' is null';

EXECUTE sql;


        FETCH datcheck_C INTO colname;
        END loop;




1、提取check_table表的所有字段名,存入tmp_check_col
sql := 'create temp table tmp_check_col as  SELECT a.attname
            FROM pg_class as c,pg_attribute as a
        where c.relname = '''||check_table||''' and a.attrelid = c.oid and a.attnum>0
        and a.attname not in ( ''时间'' ) ';

EXECUTE sql;

2、打开游标
open datcheck_C   FOR
            SELECT  attname  from  tmp_check_col
           
3、读取游标,逐个读出字段名           
        FETCH datcheck_C INTO colname ;
        while (colname.attname is not null) loop
4、循环体内,向result_table插入某字段为空的记录
        sql :='insert into '||result_table||' select * from '||check_table||'  where '||colname.attname||' is  null and 时间 ='''||time||'''';
        EXECUTE sql;
5、循环体内,向check_table删除某字段为空的记录      
        sql :='delete from '||check_table||' b where '||colname.attname||' is  null and 时间 ='''||time||'''';
        EXECUTE sql;
     
        FETCH datcheck_C INTO colname;
END loop;

CLOSE datcheck_C;           


基于postgresSQL的数据核查方案-一种基于OOSE方法_第1张图片

基于postgresSQL的数据核查方案-一种基于OOSE方法_第2张图片


基于postgresSQL的数据核查方案-一种基于OOSE方法_第3张图片


基于postgresSQL的数据核查方案-一种基于OOSE方法_第4张图片


基于postgresSQL的数据核查方案-一种基于OOSE方法_第5张图片


基于postgresSQL的数据核查方案-一种基于OOSE方法_第6张图片


基于postgresSQL的数据核查方案-一种基于OOSE方法_第7张图片


基于postgresSQL的数据核查方案-一种基于OOSE方法_第8张图片


基于postgresSQL的数据核查方案-一种基于OOSE方法_第9张图片


基于postgresSQL的数据核查方案-一种基于OOSE方法_第10张图片









你可能感兴趣的:(sql)