Динамическая проверка таблицы SQL для измерения качества данных

#tsql #dynamic-sql #data-quality

Вопрос:

У меня есть следующий код для проверки nulls во всей таблице с использованием динамического sql:

 /*Completitud*/
--Housekeeping:
drop table if exists tmp_completitud;
--Declarar variables para el loop:
declare @custom_sql   VARCHAR(max)
declare @tablename as VARCHAR(255) = 'maestrodatoscriticos' --Nombre de tabla a usar.
--Reemplazar '_[dimension]' como "apellido" de la tabla por cada nueva dimension:
set @custom_sql = 'select '''   @tablename   '_Completitud'   ''' as tabla'
select @custom_sql =
           --Reemplazar query de dimension aqui:
       @custom_sql   ', '   'sum(cast(iif('   c.name   ' is null,0,1) as decimal)) / count(*) as '   c.name
from sys.columns c
         inner join sys.tables t on c.object_id = t.object_id
where t.name = @tablename
set @custom_sql = @custom_sql   ' into tmp_completitud from '   @tablename
--print @custom_sql
exec (@custom_sql);
--Poblar tabla de dimensiones con dimension actual:
insert into dimensiones
select *
from tmp_completitud;
 

Теперь я хочу проверить наличие уникальных значений, но мне трудно работать с агрегатными функциями внутри подзапроса. До сих пор у меня было:

 select sum(cast(iif(
            ( select sum(cnt) from ( select count(distinct identificacion) as cnt from maestrodatoscriticos ) as x ) =
            ( select sum(cnt2) from ( select count(identificacion) as cnt2 from maestrodatoscriticos ) as y ), 0,
            1) as decimal)) / count(*)
from maestrodatoscriticos;
 

И я хотел бы как-то интегрировать select sum(cast(iif... это в select @custom_sql = ... вышесказанное. Есть какие-нибудь идеи?

Ответ №1:

На самом деле я решил эту проблему с некоторой помощью коллеги. Код такой:

 /*Unicidad*/
--Housekeeping:
drop table if exists tmp_unicidad;
--Declarar variables para el loop:
declare @sqluni VARCHAR(max) declare @tableuni as VARCHAR(255) = 'maestrodatoscriticos' --Nombre de tabla a usar.
--Reemplazar '_[dimension]' como "apellido" de la tabla por cada nueva dimension:
set @sqluni = 'select '''   @tableuni   '_Unicidad'   ''' as tabla'
select @sqluni =
           --Reemplazar query de dimension aqui:
       @sqluni   ', '   'count(distinct '   c.name   ') * 1.00 / count(*) * 1.00 as '   c.name
from sys.columns c
         inner join sys.tables t on c.object_id = t.object_id
where t.name = @tableuni
set @sqluni = @sqluni   ' into tmp_unicidad from '   @tableuni
--print @custom_sql
exec (@sqluni);
--Poblar tabla de dimensiones con dimension actual:
insert into dimensiones
select *
from tmp_unicidad;
 

Комментарии:

1. Ключ заключался не в использовании sum или cast , а в простой математике из select : select count(distinct column) * 1.00 / count(*) * 1.00 as alias