Skip to main content
Announcements
Have questions about Qlik Connect? Join us live on April 10th, at 11 AM ET: SIGN UP NOW
cancel
Showing results for 
Search instead for 
Did you mean: 
Anonymous
Not applicable

Calcular número de días en base a seleccion de dia, mes, año

Hola, tengo la siguiente duda: yo tengo 3 campos dia, mes y año. Lo que yo necesito es saber el número de dias que hay en esa selección.

Por ejemplo si selecciona los 3 campos, seria:

     (GetSelectedCount(dia) * GetSelectedCount(año)* GetSelectedCount(mes)

Ahi si tendría el número de días. Si la selección solo fuera años, seria tambien fácil, porque solo habría que multiplicar el número de años por 365 si son años completos y el actual por el número de dias que se lleven hasta el dia de hoy. El dia de hoy sería con Today(), pero el número de dias hasta ese día no se con que función seria.

Pero el cálculo que me resulta realmente complicado es en el que el usuario me haga solo una selección de meses y años. Porque no todos los meses tienen el mismo número de dias, no sirve hacer

31 * getselectedcount(año)*getselectedcount(mes)

Si alguien se le ocurre alguna sugerencia.....

Un saludo

30 Replies
JoaquinLazaro
Partner - Specialist II
Partner - Specialist II

Hola Jonay:

El campo día tiene máximo 31 valores y eso no cambiará seleccionando meses o años.

Si quieres saber cuantos días tienes seleccionados añade un campo en tu calendario

LOAD DIA,

          MES,

          AÑO.

          1 as ContadorDias

A partir de hay puedes hacer un SUM( ContadorDías)

Espero que te sirva de ayuda,

Joaquín

Anonymous
Not applicable
Author

Hola Joaquín,

          el problema que tengo en la solución que me presentas, es que cada combinacion de dia, mes, año no es única, sino que puede aparecer más de una vez, en los registros que guardo y si lo hago así para un mismo dia puede aparecer 100 veces

          ¿como hago para que cada combinacion de dia, mes, año me la contabilice como 1?

Es que la opcion load distinct solo afecta al campo dia, por ejemplo, pero no hace un distinct (dia, mes, año)

Un saludo

JoaquinLazaro
Partner - Specialist II
Partner - Specialist II

Hola Jonay:

Ventas:

LOAD Date(MakeDate(Año, Mes, Dia), 'YYYY/MM/DD') as Fecha

          Importe ....

          (aquí sin día mes año)

Calendario:

LOAD Date(MakeDate(Año, Mes, Dia), 'YYYY/MM/DD') as Fecha

          Day(Fecha) as DIA,

          Num(Month(Fecha)) as Mes,

          Year(Fecha) as Año.

          1 as ContadorDias

Resident Ventas;

Saludos,

Joaquín

Anonymous
Not applicable
Author

Hola Joaquín, tengo un problema por asi decirlo, te explico como hago yo la carga de datos:

La tabla que tu llamas ventas, yo la genero a traves de un select de sql, en ese select yo saco un campo fecha, y lo que hago es a partir de ese campo generar los campos año, mes y día,(en la misma sentencia) que luego utilizo  para que el usuario pueda seleccionar dia, mes o año.

ventas: fecha, año, mes y dia

Entonces, partiendo que yo ya dispongo de esos 4 campos, en mi tabla "ventas" original, como puedo hacer para que cada dia solo me cuente como uno, y no cada aparicion de fecha

Gracias siempre por tu ayuda, de verdad avanzo mucho

Un saludo

JoaquinLazaro
Partner - Specialist II
Partner - Specialist II

Hola Jonay:

En la tabla principal (tabla de HECHOS en QV) no necesitas separarlo en tres; porque se asocian dichos campos mediante la tabla de dimensiones a través el campo fecha.

Joaquín

Anonymous
Not applicable
Author

mmm, tengo dudas de como vincular correctamente las fechas, te explico el punto en el que estoy ahora:

genero la tabla "ventas" con los campos fecha,dia, mes y año. Genero estos 3 últimos campos para luego ponerlos en los selectores.

Hay que plantearse que no todos los días tiene que haber ventas, pero para la media ese dia si hay que tenerlo en cuenta, por eso lo que hice fue generar un calendario maestro desde el dia que tengo ventas hasta el dia de hoy

  Calendario:

       load

       date(IterNo() + $(vMin)-1) as fecha2

       AutoGenerate 1 while IterNo() + $(vMin) -1 <= $(vMax);

A partir de dicho calendario, genero los campos dia, mes y año, y le añado el campo 1 as contadorDia

load distinct(fecha2), year(fecha2) as añoAux, Num(Month(fecha2)) as mesAux, Day(fecha2) as diaAux,

       1 as contadorDias

       resident Calendario;

Bien, hecho así, con calendario consigo bien el número de dias que transcurren en base a la selección que hago

El problema es que son campos diferentes, por eso la solución que habia encontrado(chapuza) duplicar los 2 selectores. Uno para que me seleccione la fecha real de la venta, y otro para que me calcule los dias totales que hay en dicha seleccion.

No se como hacer para que con solo 4 campos, fecha, dia, mes y año, me calcule ambas cosas de manera correcta. Porque como dije antes, una misma fecha puede estar muchas veces en la tabla ventas.

Un saludo

JoaquinLazaro
Partner - Specialist II
Partner - Specialist II

Vale.

Tienes una tabla calendario y una tabla ventas.

Deja en ambas el campo fecha con el mismo nombre y se asociarán de forma automática; los campos día, mes y año déjalos en la tabla calendario como están asociados mediante el campo fecha no los necesitas en la tabla ventas.

Los selectores individuales que apunten a los campos del calendario.

Saludos,

Joaquín

Anonymous
Not applicable
Author

Buenas Joaquín, así funciona a medias, porque cuando en la tabla ventas si estan todos los días posible de ventas, si me da el número exacto de días posibles, pero en cambio los días que no hay venta, como no hay relacion a través del campo fecha solo me da el número de dias en los que haya coincidencia. ¿Como puedo solucionar dicho problema?

JoaquinLazaro
Partner - Specialist II
Partner - Specialist II

Crea un calendario maestro, yo te lo he propuesto desde la tabla de ventas pero hay más posibilidades, te paso unos enlaces para que crees tu propio calendario.

Creating A Master Calendar

Calendario maestro para QlikView - Master Calendar | Aegis

Como sugerencia te diría que lo crees en un  qvw separado y lo guardes en un QVD, te servirá para todas las aplicaciones que desarrolles.

Saludos,

Joaquín