calcular los datos para los días de la semana en una fecha futura

Un usuario Pregunto ✅

lawada

en nuestro negocio tenemos una función que permite a los usuarios reservar un horario y un día de la semana para recibir su servicio (semanal o quincenal), por ejemplo, el usuario X reservó su servicio para el viernes a las 10:00 a.m. Semanalmente, el usuario Y ha reservado su servicio para ser todos los martes 1:00 p. m. quincenal

Por lo tanto, el usuario X recibirá su servicio el viernes a las 10:00 a.m. (cada semana) y el usuario Y recibirá su servicio el martes a la 1:00 p.m. (cada dos semanas)

la solicitud es:

cree una matriz para cada fecha futura que muestre cuántos usuarios han reservado un intervalo de tiempo específico, por ejemplo:

martes 07-06-2021 Miércoles 07-07-2021 Jueves 07-08-2021 Viernes 07-09-2021 Sábado 07-10-2021 Domingo 07-11-2021 Lunes 07-12-2021 martes 13-07-2021 Miércoles 07-14-2021 Jueves 15-07-2021 Viernes 07-16-2021 Sábado 17-17-2021 Domingo 18-07-2021 Lunes 19-07-2021 martes 20-07-2021 Miércoles 07-21-2021 Jueves 22-07-2021 Viernes 23-07-2021
10:00 A.M 1 usuario 1 usuario 1 usuarios
11 A.M
12:00 PM
13:00 1 usuario

1 usuario

como puede ver, las fechas están en el futuro y no existen en nuestra base de datos,

los datos que tengo son:
-ID de usuario
-día laborable
-tiempo
-fecha de servicio (los datos se mostrarán una vez que haya pasado la fecha de servicio, si la fecha aún no ha llegado, los datos serán NULL)

ex para la tabla:

ID de usuario Día laborable Tiempo Fecha de publicación frecuencia
124 Tusday 6:00 p. M. 27/6/2021 semanalmente
567 viernes 11 A.M NULO semanalmente
566 domingo 16:00 NULO quincenal
433 viernes 3:00 PM NULO quincenal

Entonces, ¿cómo puedo contar el total de usuarios que reservaron un servicio cada día de la semana (semanal / quincenal) para las fechas futuras?

ERD

Hola @lawada, ¿cuál es la fecha de inicio del caso de frecuencia quincenal?

lawada

En respuesta a ERD

es como un calendario, suponga que comienza a partir de hoy, si un usuario tiene una frecuencia quincenal todos los martes a las 10:00 a.m., entonces este usuario debe contarse con el martes 13/07/2021 10:00 a.m. – 27/07/2021 10:00 AM- 08/10/2021 10:00 AM y así sucesivamente.

ERD

En respuesta a lawada

@lawada,

Necesita tener tablas de fecha y hora.

No sé cómo se ven sus datos reales y si su tabla de ejemplo tiene las mismas columnas que en el escenario real, por lo que no estoy seguro de si es el mejor enfoque en su caso, pero puede intentar jugar con esto la medida:

Measure = 
VAR frequency = MAX ( T[frequency] )
VAR countUsers =
    CALCULATE (
        DISTINCTCOUNT ( T[User ID] ),
        CROSSFILTER ( 'Weekday'[Day Name], 'Date'[Day Name], BOTH ),
        CROSSFILTER ( T[Week day], 'Weekday'[Day Name], BOTH )
    )
RETURN
    SWITCH (
        TRUE (),
        frequency = "weekly", countUsers,
        frequency = "biweekly", IF ( ISEVEN ( MAX ( 'Date'[Week of Year] ) ), "", countUsers ),
        ""
    )

ERD_0-1626165154820.png

ERD_1-1626165967847.png

ERD_2-1626166014059.png

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.

lawada

En respuesta a ERD

Noté que creó una relación 1: 1 entre la tabla de tiempos y la tabla Tl6, sin embargo, en la tabla de la fuente de datos el tiempo no es una clave única, muchos usuarios pueden tener timimgs similares, por lo que la relación en este caso sería 1: *

ERD

En respuesta a lawada

@lawada,

Concerniente a 1: * relación con la tabla de tiempos – está bien. Aquí es 1: 1 debido a los datos en sí.

No puedo compartir el archivo, pero puedo compartir los scripts de PQ:

1 vez

let
    Source = List.Times(#time(0,0,0),24*60*60,#duration(0,0,0,1)),
    #"Converted to Table" = Table.FromList(Source, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    #"Renamed Columns" = Table.RenameColumns(#"Converted to Table",{{"Column1", "Time"}}),
    #"Changed Type" = Table.TransformColumnTypes(#"Renamed Columns",{{"Time", type time}}),
    #"Inserted Start of Hour" = Table.AddColumn(#"Changed Type", "Start of Hour", each Time.StartOfHour([Time]), type time)
in
    #"Inserted Start of Hour"

2) Fecha

let
    Today=Date.From(DateTime.LocalNow()), // today's date
    FromYear = 2020, // set the start year of the date dimension. dates start from 1st of January of this year
    ToYear=2022, // set the end year of the date dimension. dates end at 31st of December of this year
    FromDate=#date(FromYear,1,1),
    ToDate=#date(ToYear,12,31),
    Source=List.Dates(
        FromDate,
        Duration.Days(ToDate-FromDate)+1,
        #duration(1,0,0,0)
    ),
    #"Converted to Table" = Table.FromList(Source, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    #"Renamed Columns" = Table.RenameColumns(#"Converted to Table",{{"Column1", "Date"}}),
    #"Changed Type" = Table.TransformColumnTypes(#"Renamed Columns",{{"Date", type date}}),
    #"Inserted Year" = Table.AddColumn(#"Changed Type", "Year", each Date.Year([Date]), Int64.Type),
    #"Inserted Month" = Table.AddColumn(#"Inserted Year", "Month", each Date.Month([Date]), Int64.Type),
    #"Inserted Day Name" = Table.AddColumn(#"Inserted Month", "Day Name", each Date.DayOfWeekName([Date]), type text),
    #"Inserted Day of Week" = Table.AddColumn(#"Inserted Day Name", "Day of Week", each Date.DayOfWeek([Date]), Int64.Type),
    #"Inserted Month Name" = Table.AddColumn(#"Inserted Day of Week", "Month Name", each Date.MonthName([Date]), type text),
    #"Added Custom4" = Table.AddColumn(#"Inserted Month Name", "Month Year", each Text.Start([Month Name], 3) & "-" & Text.End(Text.From([Year]),2)),
    #"Inserted Week of Year" = Table.AddColumn(#"Added Custom4", "Week of Year", each Date.WeekOfYear([Date]), Int64.Type)
in
    #"Inserted Week of Year"

3) Día de la semana

ERD_0-1626185656352.png

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.

lawada

En respuesta a ERD

¡Gracias por compartir los códigos PQ! pero una duda es, ¿cómo creaste la columna?

'Date'[Week of Year]

ya que no se agrega dentro de la tabla de fechas, ¿puede explicar cómo funciona esta línea en la medida que creó?

 frequency = "biweekly", IF ( ISEVEN ( MAX ( 'Date'[Week of Year] ) ), "", countUsers ),

ERD

En respuesta a lawada

@lawada, por favor, revisa nuevamente el script. Agregué la última línea de código.

Detalles:

ERD_0-1626260576640.png

Como deseaba comenzar a calcular a partir de hoy, miré el número de la semana actual, si es par o no. Y luego usé la función https://dax.guide/iseven/ para contar los valores cada dos semanas.

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.

lawada

En respuesta a ERD

muchas gracias por la ayuda, utilicé exactamente los mismos pasos en mi modelo de datos, sin embargo, el código dax no dio el mismo resultado, jugué e hice algunos cambios en el modelo de datos y dax y está funcionando ahora

lawada

En respuesta a ERD

¿Puedo tener el archivo power bi, por favor? o puede compartir el código dax que creó para la tabla de tiempos, la tabla de fechas y la tabla de días de la semana. gracias de antemano..

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *