Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

Find everything you need to get certified on Fabric—skills challenges, live sessions, exam prep, role guidance, and more. Get started

Reply
Syndicate_Admin
Administrator
Administrator

Periodicidad en DAX con SUMMARIZE AND FILTER

Tengo un problema en DAX al mostrar una métrica en un gráfico de área. El objetivo es representar a los usuarios únicos que han realizado un número de acciones igual o superior a [n_veces] durante los últimos [meses] de forma consecutiva.

TotalUsuariosRecurrentes = 

VAR SELECTOR = IF([Recurrencia numerico] = 365,12,[meses])
VAR SELECTOR_veces = [n_veces]

VAR hoy        = TODAY()
VAR FechaIni   = EDATE(hoy,SELECTOR * -1)
VAR FechaFin   = hoy

VAR ResumenUsuarios = 
    SUMMARIZE(
        FILTER(
            Tabla,
            Tabla[EndOfMonth] >= FechaIni && Tabla[EndOfMonth] <= FechaFin
        ),
        Tabla[UserId],
        Tabla[EndOfMonth],
        "SumaVisitas", SUM(Tabla[N_VISITAS])
    )

VAR UsuariosRecurrentes = 
    SELECTCOLUMNS(
        FILTER(
            SUMMARIZE(
                ResumenUsuarios,
                [UserId],
                "MesesConVisitas", COUNTROWS(
                    FILTER(
                        ResumenUsuarios,
                        [UserId] = EARLIER([UserId]) &&
                        [SumaVisitas] >= SELECTOR_veces
                    )
                )
            ),
            [MesesConVisitas] >= SELECTOR
        ),
        "UserId", [UserId]
    )

RETURN
    CALCULATE(
        DISTINCTCOUNT(Tabla[UserId]),
        FILTER(
            Tabla,
            Tabla[UserId] IN UsuariosRecurrentes &&
            Tabla[EndOfMonth] >= FechaIni && Tabla[EndOfMonth] <= FechaFin
        )
    )

Para ayudarte a entender la lógica que estoy usando en la métrica, explicaré los siguientes parámetros:

1.[n_veces] = número de acciones (int)

2.[meses] = número de meses (int)

3.[Recurrencia numérica] = si el segmentador de recurrencia tiene el valor "Mensual" seleccionado, entonces 30, de lo contrario, 365 (int)

Esos parámetros filtran la tabla que se muestra a continuación y también deben filtrar la visualización de área ubicada justo debajo de la tabla.

Tp51qgoJ.png

Así es como se ven los datos:

GPIFdYjQ.png

El problema es que, cuando selecciono un número de meses mayor que 1, deja de mostrar la visualización cuando debería mostrar, en este caso concreto los últimos 3 meses (eje X) con solo 1 usuario (eje Y) ya que es el único que ha realizado al menos 2 acciones cada mes durante los últimos 3 meses:

Captura de pantalla 2024-08-09 103413.png

Usuarios de EndOfMonth

30/07/20241
30/06/20241
31/05/20241

Espero poder mostrar una evolución en esta métrica teniendo el campo de fecha en el eje X, ahora solo se puede mostrar en una visualización de KPI.

Como los datos tienen más detalle que los requeridos para la métrica (EndOfMonth,UserId,WorkspaceId,ReportId,Visits), he intentado hacer una tabla resumida sobre una variable para calcular los usuarios con las condiciones seleccionadas (UsuariosRecurrentes) y luego he intentado insertar esa lista de usuarios en el cálculo después de la declaración return.

¿Alguna ayuda en esto?

¡Muchas gracias!

5 REPLIES 5
Syndicate_Admin
Administrator
Administrator

Hola @OscarCamean

El problema puede estar en la forma en que se filtran y resumen los datos, aquí hay una idea para mejorar, espero que sea útil.
Como no conozco todos los campos de su tabla, [Meses] [N_veces] [RecurrenciaNumerico] en mi ejemplo son de datos ingresados manualmente.
Si este DAX no funciona, proporcione datos ficticios para todos los campos utilizados en su DAX y recuerde proteger su privacidad.
Además, considere la posibilidad de dividir el DAX en varias partes y depurarlo paso a paso.

1. Aquí están mis datos de muestra.

1.png 2.png 3.png 4.png

2. Cree medidas para obtener el valor seleccionado por los segmentadores.

Selected_Meses = SELECTEDVALUE(meses[meses])
Selected_N_Veces = SELECTEDVALUE(n_veces[n_veces])
RecurrencialNumerico = SWITCH(
    TRUE(),
    SELECTEDVALUE(Recurrencia[Frequency]) = "Year", 365,
    SELECTEDVALUE(Recurrencia[Frequency]) = "Month", 30,
    SELECTEDVALUE(Recurrencia[Frequency]) = "Day", 1,
    0
)


3. Create [TotalUsuariosRecurrentes] measure.

TotalUsuariosRecurrentes = 

VAR SELECTOR = IF([RecurrencialNumerico] = 365,12,[Selected_Meses])
VAR SELECTOR_veces = [Selected_N_Veces]

VAR hoy        = TODAY()
VAR FechaIni   = EDATE(hoy,SELECTOR * -1)
VAR FechaFin   = hoy

VAR ResumenUsuarios = 
    SUMMARIZE(
        FILTER(
            Tabla,
            Tabla[EndOfMonth] >= FechaIni && Tabla[EndOfMonth] <= FechaFin
        ),
        Tabla[UserId],
        Tabla[EndOfMonth],
        "SumaVisitas", SUM(Tabla[N_VISITAS])
    )

VAR UsuariosRecurrentes = 
    CALCULATETABLE(
        DISTINCT(Tabla[UserId]),
        FILTER(
            ResumenUsuarios,
            [SumaVisitas] >= SELECTOR_veces
        )
    )

RETURN
    CALCULATE(
        DISTINCTCOUNT(Tabla[UserId]),
            Tabla[UserId] IN UsuariosRecurrentes &&
            Tabla[EndOfMonth] >= FechaIni && Tabla[EndOfMonth] <= FechaFin
        )


4. Aquí está el resultado de mi prueba.

5.png

Saludos

Jarvis Tang

Si esta publicación ayuda, considere Acéptalo como la solución para ayudar a los demás miembros a encontrarlo más rápidamente.

Syndicate_Admin
Administrator
Administrator

Hola

Comparta algunos datos con los que trabajar (en un formulario que se pueda pegar en un archivo de MS Excel) y muestre el resultado esperado en un formato de tabla simple. Si es posible, asegúrese de que los nombres de las columnas estén en inglés.

¡Hola!

He editado el post con algunos datos.

¡¡Gracias!!

Syndicate_Admin
Administrator
Administrator

Hola

Comparta algunos datos con los que trabajar (en un formulario que se pueda pegar en un archivo de MS Excel) y muestre el resultado esperado en un formato de tabla simple. Si es posible, asegúrese de que los nombres de las columnas estén en inglés.

Syndicate_Admin
Administrator
Administrator

Hola @OscarCamean : la lógica de filtrado tiene en cuenta cada mes individualmente y resume correctamente los usuarios que cumplen los criterios y devuelve el número de usuarios únicos por mes que cumplen los criterios.

Verifique la siguiente medida:

TotalUsuariosRecurrentes =
VAR SELECTOR = IF([Recurrencia numerico] = 365, 12, [meses])
VAR SELECTOR_veces = [n_veces]

La carga es = tode()
Var facheini = edate(is, selector * -1)
Var fechaffin = es

VAR ResumenUsuarios =
SUMMARIZE(
FILTER(
Tabla,
Tabla[EndOfMonth] >= FechaIni && Tabla[EndOfMonth] <= FechaFin
),
Tabla[UserId],
Tabla[EndOfMonth],
"SumaVisitas", SUM(Tabla[N_VISITAS])
)

VAR UsuariosRecurrentesPorMes =
ADDCOLUMNS(
SUMMARIZE(
ResumenUsuarios,
[UserId], [EndOfMonth]
),
"CumpleCondicion",
IF(
CALCULATE(SUM([SumaVisitas]), ResumenUsuarios) >= SELECTOR_veces,
1,
0
)
)

VAR UsuariosRecurrentes =
SUMMARIZE(
FILTER(
SUMMARIZE(
UsuariosRecurrentesPorMes,
[UserId],
"MesesConVisitas", SUM([CumpleCondicion])
),
[MesesConVisitas] >= SELECTOR
),
[UserId]
)

DEVOLUCIÓN
CALCULAR(
DISTINCTCOUNT(Tabla[UserId]),
FILTRO(
Tabla,
Tabla[UserId] IN UsuariosRecurrentes &&
Tabla[EndOfMonth] >= FechaIni && Tabla[EndOfMonth] <= FechaFin
)
)

Este paso agrega una columna para indicar si el usuario cumple la condición de tener acciones >= [n_veces] en ese mes.

Espero que funcione. Por favor, compruébelo

Helpful resources

Announcements
Sept PBI Carousel

Power BI Monthly Update - September 2024

Check out the September 2024 Power BI update to learn about new features.

September Hackathon Carousel

Microsoft Fabric & AI Learning Hackathon

Learn from experts, get hands-on experience, and win awesome prizes.

Sept NL Carousel

Fabric Community Update - September 2024

Find out what's new and trending in the Fabric Community.

Top Solution Authors