Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Buenas,
tengo dos campos (fecha y venta) y quisiera hacer un acumulado añomes. ¿alguien me podria ayudar porque me gustaria entender el concepto de peek?
Hola Carlos, con este script puedes generar un acumulado en el script usando Peek:
DataOrig:
LOAD fecha,
Year(fecha) as Año,
venta
FROM
[.\acumulado por añomes.xls]
(biff, embedded labels, table is Hoja1$);
Data:
LOAD Año, fecha, venta,
If(Peek(Año)=Año, RangeSum(Peek(ventaAcu), venta), venta) as ventaAcu
Resident DataOrig Order by fecha;
DROP Table DataOrig;
La línea en negrita es la que realiza el acumulado, para realizar el acumulado es importante que la carga se realice por el orden de las fechas, lo que hace es:
- Comprobar si la fila cargada anteriormente pertenecía al mismo año que la actual:
· Si es del mismo año: Suma el valor del campo venta al valor del campo ventaAcu que tenía el registro anterior (dicho de otra forma: a lo que teníamos acumulado le sumamos lo del registro actual), y lo guardamos en el campo ventaAcu.
· Si es de otro año significa que empezamos un nuevo año y ventaAcu empezará con en valor del campo venta.
Se usa RangeSum para que en el caso de que alguna expresión devuelva null() se convierta a cero, si usásemos "Peek(ventaAcu) + venta" podría llegar a fallar.
Saludos.
Hola Carlos:
La mejor forma de manipular fechas con QV es crear un calendario maestro, aquí tienes una propuesta Campos Calendario del compañero sorrakis01
El concepto PEEK recupera un valor de un campo en orden secuencial de llegada, creo que no te será útil para este problema. Aquí tienes más información Peek ‒ QlikView
Saludos
Joaquín
Entiendo Joaquín que entoces para hacer un acumulado es mejor utilizar un rangesum o un aggr en una tabla pivotante???
Carlos,
Crea un calendario con
Calendario:
LOAD
Fecha,
Año,
Mes,
Dia,
AñoMes,
siguiendo las instrucciones de Jordi.
NOTA: El campo fecha de la FactTable tiene que tener el mismo nombre que en el calendario
En el gráfico usas como dimensión AñoMes y como expresión SUM(Ventas)
No necesitas nada más.
Saludos
Joaquín
Hola Joaquin pero asi entiendo que no tendria un acumulado. Lo que quisiera es que feb 2016 recogiera las ventas de enero2016+feb2016, en marzo 2016=enero2016+feb2016+marzo2016
Hola Carlos:
Entonces la dimensión que sea MES
SUM ( { <Año={$(=year(today()))} > } Ventas ) y marcas la casilla Acumulación Completa en las propiedades de la expresión.
El set análisis del SUM evita que sumen las ventas de igual mes de años anteriores.
Saludos
Joaquín
Otra opción que puedes utilizar es acumular en script. Con tu ejemplo:
Datos:
Load * Inline [
fecha,venta
01/10/2015,34
16/10/2015,23
31/10/2015,28
15/11/2015,33
30/11/2015,38
15/12/2015,43
30/12/2015,48
14/01/2016,53
29/01/2016,58
13/02/2016,63
28/02/2016,68
14/03/2016,73
29/03/2016,78
13/04/2016,83
28/04/2016,88
13/05/2016,93
28/05/2016,98
12/06/2016,103
27/06/2016,108
12/07/2016,113
27/07/2016,118
11/08/2016,123
26/08/2016,128
10/09/2016,133
25/09/2016,138
10/10/2016,143
25/10/2016,148
09/11/2016,153
24/11/2016,158
09/12/2016,163
24/12/2016,168
08/01/2017,173
23/01/2017,178
07/02/2017,183
22/02/2017,188
];
Inicial:
Load
fecha,
venta,
Year(fecha) as Año,
Month(fecha) as Mes,
text(num(Month(fecha),'00')) as #Mes,
num(year(fecha)&text(num(Month(fecha),'00')))as AñoMes
Resident Datos
;
Acumulado:
Load AñoMes, Año as Year, Mes as Month, sum(venta) as Acumulado
Resident Inicial
Group by AñoMes, Año, Mes
Order by fecha;
DROP Tables Datos;
Con esto consigues disponer de una tabla acumulada por Año y Mes, además de la tabla original.
Hola Carlos, con este script puedes generar un acumulado en el script usando Peek:
DataOrig:
LOAD fecha,
Year(fecha) as Año,
venta
FROM
[.\acumulado por añomes.xls]
(biff, embedded labels, table is Hoja1$);
Data:
LOAD Año, fecha, venta,
If(Peek(Año)=Año, RangeSum(Peek(ventaAcu), venta), venta) as ventaAcu
Resident DataOrig Order by fecha;
DROP Table DataOrig;
La línea en negrita es la que realiza el acumulado, para realizar el acumulado es importante que la carga se realice por el orden de las fechas, lo que hace es:
- Comprobar si la fila cargada anteriormente pertenecía al mismo año que la actual:
· Si es del mismo año: Suma el valor del campo venta al valor del campo ventaAcu que tenía el registro anterior (dicho de otra forma: a lo que teníamos acumulado le sumamos lo del registro actual), y lo guardamos en el campo ventaAcu.
· Si es de otro año significa que empezamos un nuevo año y ventaAcu empezará con en valor del campo venta.
Se usa RangeSum para que en el caso de que alguna expresión devuelva null() se convierta a cero, si usásemos "Peek(ventaAcu) + venta" podría llegar a fallar.
Saludos.
Muchas gracias Ruben por tu aclaración y modelo ya que era realmente lo que buscaba.
De todas formas, todo los ejemplos presentados son buenos para aprender cada día un poquito más.