Skip to main content
Announcements
NEW: Seamless Public Data Sharing with Qlik's New Anonymous Access Capability: TELL ME MORE!
cancel
Showing results for 
Search instead for 
Did you mean: 
walterlh
Creator II
Creator II

OPERACIÓN CON REGISTRO ANTERIOR - TABLA PIVOT

Hola a todos! Hace unos días que estoy intentando algo que no he podido resolver. Paso a contarles a ver si me pueden ayudar con ello:

Tengo 2 tablas:

- animales

- pesaje

En la primera se registran los animales que entran a la veterinaria desde su nacimiento, y en la tabla pesaje se registra la evolución del peso de cada animal.

En una tabla pivot (o pivotante) de manera muy simple he intentado mostrar esos pesos de manera exitosa como muestro en la siguiente imagen:

1.png

NOTA: la fecha aparece así porque arrastré la dimensión fecha hacia arriba para que se muestre de manera horizontal.

El problema es que ahora tengo que agregar otra expresión donde calcule cuantos gramos o kilos ha variado el peso de una a otra fecha. Pensé que iba a solucionarlo con la función BEFORE, pero al haber registros null en algunos casos porque no se pesan todos exactamente la misma fecha, solamente realiza el cálculo cuando tiene un registro anterior. COMO PUEDO SOLUCIONARLO?

Así con error:

Imagen1.png

Así sin error:

2.png

En el caso sin error echo en Excel para tal fin, vemos que en el "Perro 1" se pesó todos los días y por lo tanto no hay problemas. Sin embargo en el caso del "Perro 2" la variación del peso "Dif. Ant." de la fecha 05/08/2016 es correcto que sea null porque el 01/07/2016 no se lo pesó, o en tal caso 1,2 teniendo en cuenta que el peso anterior es 0. Sin embargo (y aquí el problema) en el peso registrado el 23/10/2016 la variación debería ser de 2 KG porque al no haberse pesado el 07/09/2016, se debe tomar el peso del 27/08/2016 (1,5KG)

3,5 - 1,5 = 2 KG.

Espero que me puedan ayudar. ADJUNTO .QVW

Walter.

3 Replies
rubenmarin

Hola Walter, puedes modificar la carga para añadir el peso anterior de cada animal:

pesaje_tmp:

LOAD * Inline [

...

];

pesaje:

NoConcatenate

LOAD id_pesaje, fecha, id_animal, peso, If(Peek('id_animal')=id_animal, Peek(peso)) as pesoAnt

Resident pesaje_tmp Order By id_animal, fecha;

DROP Table pesaje_tmp;

Para obtener la diferencia podrías usar:

Sum(peso)-Sum(pesoAnt)

walterlh
Creator II
Creator II
Author

Ruben aprecio tu ayuda. Lo he probado y el inconveniente que tengo con tu idea es que en la primer fecha de la tabla (01/07/2016, siguiendo con el último ejemplo) calcula un peso anterior que no corresponde al id_animal. Pienso que debe traer un registro anterior en la tabla pesaje, pero que corresponde a otro animal.

rubenmarin

Hola Walter, para el primer mes de cada animal supongo que mostrará el mismo valor que el peso, ya que la diferencia se realizará sobre cero.

Al hacer If(Peek('id_animal')=id_animal ya se comprueba que se trata del mismo animal.

Si quieres evitar la operación cuando el peso anterior es 0 o no hay peso anterior puedes poner como expresión:

If(Alt(pesoAnt, 0)<>0, Sum(peso)-Sum(pesoAnt))

Si no es por eso añade una captura o escribe las diferencias para saber de donde viene el "peso anterior que no corresponde al id_animal" porque es difícil imaginar lo que pueda estar pasando sin ver datos.

Saludos.