En Artus, al hacer una carga de datos los agregados mensuales o de otros periodos quedan con los totales incorrectos ya que se calculan con un rengo de fechas diferentes al rango con el que se hizo la carga.

Esto se puede descubrir por que se ve un total en el dashboard pero al hacer drill down es otro el total


Síntoma


Al revisar el log de cargas se puede ver que el agregado mensual se calcula a partir del agregado diario pero si por ejemplo se carga del día 1 al día 11 del mes entonces el agregado mensual se calcula con el con un dia menos de datos por lo que el total mensual no incluye el ultimo dia del rango cargado y da menos.


Diagnostico


Para diagnosticar si el espacio de datos tiene este problema se puede utilizar la siguiente consulta SQL que cuenta la cantidad de días que existe en la tabla dimtime por año. Si existen años con menos de 365 dias entonces el problema está presente en la base de datos


SELECT `year`,COUNT(*) FROM dimtime 
WHERE `year` BETWEEN 2010 AND 2050
GROUP BY `year`
HAVING COUNT(*)<365
ORDER BY 1



Solución


El problema se debe a que el calculo de agregados depende del contenido de la tabla dimtime. Si la tabla dimtime tiene días faltantes entonces el engine no puede calcular correctamente el rango de fechas a recalcular. Es necesario generar todos los dias del año en la dimtime, de preferencia varias años hacia adelante para que nunca falte uno (por default en kpi se usa hasta el 2050).


Para llenar la tabla dimtime con los días faltantes se puede usar este store procedure, hay que crearlo en la base de datos y luego ejecutarlo. Se encargará de generar todos los días faltantes desde el año 2010 al año 2050 en la base de datos.


DELIMITER $$

DROP PROCEDURE IF EXISTS `FillDimTimeWithData`$$

CREATE PROCEDURE `FillDimTimeWithData`()
BEGIN
SET @ff = '2050-12-31';
SET @fi = '2010-01-01';
WHILE (@fi <= @ff) DO
INSERT IGNORE INTO dimtime(DateKey, DateID, YEAR, QUARTER, MONTH, WEEKOFYEAR, DAYOFMONTH, HOUR, TwoWeeks)
SELECT YEAR(@fi)*10000+MONTH(@fi)*100+DAY(@fi) AS DateKey,
@fi AS DateID,
YEAR(@fi) AS TheYear,
CONCAT(CONVERT(YEAR(@fi), CHAR(4)),'/',CONVERT(QUARTER(@fi), CHAR(1))) AS TheQuarter,
DATE_FORMAT(@fi,'%Y/%m') AS TheMonth,
DATE_FORMAT(@fi,'%Y/%u') AS WEEKOFYEAR,
DATE_FORMAT(@fi,'%Y/%m/%d') AS DAYOFMONTH,
DATE_FORMAT(@fi,'%Y/%m/%d/00') AS TheHour,
DATE_FORMAT('2009-12-01','%Y/%m/01') AS TwoWeeks;
SET @fi = DATE_ADD(@fi, INTERVAL 1 DAY);
END WHILE;
END$$

DELIMITER ;


IMPORTANTE: Este store tiene el formato default usado en kpionline, es posible que el usuario haya cambiado el formato default usado, así que hay que verificar. 


Para ejecutar el store solo usar:


CALL FillDimTimeWithData()
;


Una vez corregidos los agregados ejecutar la tarea, ya debería hacer el calculo correctamente