Hola abraham85.
Disculpa que sea un poco pesado pero te lo pregunto nuevamente ¿Es necesario llevar un informe de los precio normalizados período a período para cada producto? ¿O esperas que el informe solo muestre una normalización para un producto y período en particular?
Si es lo primero entonces es de esperar que el informe esté compuesto de muchos registros. Podría hablarse de un único registro para el segundo caso.
Voy a suponer que se trata del primero. Y te voy a dar unas guías; para que lo puedar llevar a MS SQL Server. Demás está decir que considero oportuno hacerlo por medio de un SP.
1) Traer la consulta de precios ordenada por productos, mes (asc) y período (asc). De este modo tendremos las cosas más fácil para hacer la operatoria ya que los registros a comparar estarán uno seguido del otro.
2) Para esa consulta exploramos registro a registro, para cada producto:
2.1. Para el primer registro el campo Normalizado no puede calcularse, es N/A. Esto es fácil de ver sabiendo que no hay un registro anterior con que comparar. Guardamos el valor de PreNormalizado en una variable temporal Valor1. No hay más que hacer, nos vamos al siguiente registro.
2.2. Leemos el campo PreNormalizado del registro actual y lo guardamos en Valor2.
2.3. Calculamos:
Normal = ((Valor1/Valor2)*100) - 100
2.4. En el campo Normalizado almacenamos dicho valor Normal. Seguidamente hacemos que Valor1 asuma el valor de Valor2. y nos vamos al siguiente registro.
3. Repetimos paso 2.2 a 2.4 hasta legar al siguiente producto. En este punto debemos "limpiar" las variables para iniciar de nuevo el proceso descripto anteriormente. Es decir, cuando ProductoActual <> ProductoAnterior.
Este SP puede devolver los mismos registros de la consulta inicial, simplemente le agrega un campo extra para calcular el valor del precio normalizado.
Sólo nos resta invocarlo:
Select * from ProcedimientoNormalizar()
E incluso esto nos permite filtrarlos. Como dices que te interesa aquellos cuya normalización supere los 5% basta con ponerle un where:
Select * from ProcedimientoNormalizar() where Normalizado >= 0.05
El SP incluso se puede modificar para trabajar con un producto en particular (lo que haría más fácil la implementación ya que no requiere de evaluaciones previas para comprobar si comienza un nuevo producto). El SP puede recibir como parámetro el ID del producto y la consulta incluiría un where IDProducto = ID.
Select * from ProcedimientoNormalizar(ID) where Normalizado >= 0.05
Espero al menos haber dado un norte.
Saludos,