Visualización del lado opuesto / inverso de las fechas en rodajas

Un usuario Pregunto ✅

Anónimo

Hola.

Tengo una tabla donde una fila muestra una escuela, una fecha de inicio de comedor en la escuela, una fecha de finalización de comedor en la escuela y el tipo de comedor. Cuando analizo fechas específicas, me gustaría mostrar qué escuelas no tienen comedor en las fechas específicas. (es decir, lo contrario).

Tengo el siguiente ejemplo, donde existen las escuelas A, B, C, D y E.

Escuela | Inicio | Finalizar | Tipo de comedor
A | 01.01.2020 | 15.01.2020 | 1
A | 01.01.2019 | 15.01.2019 | 1
A | 01.01.2020 | 30.03.2020 | 2
B | 01.01.2019 | 15.01.2019 | 1
C | nulo | nulo | nulo
D | 01.01.2020 | 15.01.2020 | 2
D | 01.12.2019 | 01.02.2020 | 1
E | nulo | nulo | nulo

Si corto en el 2 de enero de 2020 se deben mostrar las escuelas B, C y E. Si corte el 3 de marzo, deberían mostrarse las escuelas B, C, D y E. Y, por supuesto, si recojo el 1 de enero de 2018, deberían mostrarse todas las escuelas.

¡Espero que puedas ayudarme!

VikramBasriyar

1. Cree el nombre de la tabla de origen: «t1»

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WclTSUTIwVPBKzCtNLKpUMDIwMgCKGJpiiCjF6mBRbWiJrhoigl012CRjAwXfxKLkDBjfCKzWiSSTnYEsKAJxXYj0hBGyapfU5NTcpNQimMlAIbfUpCJMT7siWRYLAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [School = _t, Start = _t, Finish = _t, Type = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"School", type text}, {"Start", type date}, {"Finish", type date}, {"Type", Int64.Type}})
in
    #"Changed Type"

2. Una tabla de fechas (Calendario): la tabla calculada asígnele el nombre Fecha. (Use la pestaña Modelado para agregar New Table Paste debajo de Dax

Date = CALENDAR(DATE(2018,1,1),MAX(t1[Finish]))

3. cree una tabla «Escuela» usando el siguiente dax:

School = DISTINCT(SELECTCOLUMNS(t1,"School",t1[School]))

4.Crear una medida

Measure = 
var t2=SELECTCOLUMNS(t1,"sc",t1[School],"Flag",IF(ISBLANK(t1[Finish]),FALSE(),t1[Finish]>= SELECTEDVALUE('Date'[Date])&&t1[Start]<= SELECTEDVALUE('Date'[Date])))
return
SWITCH(TRUE(),NOT(SELECTEDVALUE(School[School])) in SELECTCOLUMNS(filter(t2,[Flag]=TRUE()),"sc",[sc]),1,0)

5. Aplique esta medida en el filtro visual como se muestra a continuación.

s.3.3.20203.3.20202.1.20202.1.2020Nueva tabla y panel de filtro seleccionado fecha 1.1..2018Nueva tabla y panel de filtro seleccionado fecha 1.1..2018

Hola, @Anónimo

Basándome en tu descripción, creé datos para reproducir tu escenario. El archivo pbix se adjunta al final.

Tabla:

j1.png

Calendario (una tabla calculada):

Calendar = CALENDAR(DATE(2018,1,1),DATE(2020,12,31))

No existe relación entre dos tablas. Puede crear una medida como se muestra a continuación.

Visual Control = 
var _mindate = 
CALCULATE(
    MIN('Calendar'[Date]),
    ALLSELECTED('Calendar')
)
var _maxdate = 
CALCULATE(
    MAX('Calendar'[Date]),
    ALLSELECTED('Calendar')
)
var _start = SELECTEDVALUE('Table'[Start])
var _end = SELECTEDVALUE('Table'[End])
return
IF(
    OR(
        OR(
                _end<_mindate,
                _start>_maxdate
        ),
        ISBLANK(SELECTEDVALUE('Table'[Type of canteen]))
    ),
    1,0
)

Luego, debe colocar la medida en el filtro de nivel visual para obtener el resultado.

j2.png

Atentamente

Alano

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

Anónimo

En respuesta a v-alq-msft

Hola Allan.

Miré el archivo pbix. Cuando intenté cortar el 2 de enero apareció la Escuela A, que no debería.

Saludos cordiales

Louise.

VikramBasriyar

1. Cree el nombre de la tabla de origen: «t1»

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WclTSUTIwVPBKzCtNLKpUMDIwMgCKGJpiiCjF6mBRbWiJrhoigl012CRjAwXfxKLkDBjfCKzWiSSTnYEsKAJxXYj0hBGyapfU5NTcpNQimMlAIbfUpCJMT7siWRYLAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [School = _t, Start = _t, Finish = _t, Type = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"School", type text}, {"Start", type date}, {"Finish", type date}, {"Type", Int64.Type}})
in
    #"Changed Type"

2. Una tabla de fechas (Calendario): la tabla calculada asígnele el nombre Fecha. (Use la pestaña Modelado para agregar New Table Paste debajo de Dax

Date = CALENDAR(DATE(2018,1,1),MAX(t1[Finish]))

3. cree una tabla «Escuela» usando el siguiente dax:

School = DISTINCT(SELECTCOLUMNS(t1,"School",t1[School]))

4.Crear una medida

Measure = 
var t2=SELECTCOLUMNS(t1,"sc",t1[School],"Flag",IF(ISBLANK(t1[Finish]),FALSE(),t1[Finish]>= SELECTEDVALUE('Date'[Date])&&t1[Start]<= SELECTEDVALUE('Date'[Date])))
return
SWITCH(TRUE(),NOT(SELECTEDVALUE(School[School])) in SELECTCOLUMNS(filter(t2,[Flag]=TRUE()),"sc",[sc]),1,0)

5. Aplique esta medida en el filtro visual como se muestra a continuación.

s.3.3.20203.3.20202.1.20202.1.2020Nueva tabla y panel de filtro seleccionado fecha 1.1..2018Nueva tabla y panel de filtro seleccionado fecha 1.1..2018

Anónimo

En respuesta a VikramBasriyar

Hola @VikramBasriyar

¡Esto funcionó perfectamente! Gracias.

VikramBasriyar

En respuesta a Anónimo

Para el intervalo de fechas, utilice esta medida:

Measure = 
var t2=SELECTCOLUMNS(t1,"sc",t1[School],"Flag",IF(ISBLANK(t1[Finish]),FALSE(),(MIN('Date'[Date])<=t1[Finish] && t1[Finish] >= MAX('Date'[Date]))||(MIN('Date'[Date])<=t1[Start] && t1[Start]>= MAX('Date'[Date]))))
var t3=SELECTCOLUMNS(t1,"sc",t1[School],"Flag",IF(ISBLANK(t1[Finish]),FALSE(),t1[Type]= SELECTEDVALUE(t1[Type])))

return
SWITCH(TRUE(),NOT(SELECTEDVALUE(School[School])) in SELECTCOLUMNS(filter(t2,[Flag]=TRUE()),"sc",[sc])  &&  NOT(SELECTEDVALUE(School[School])) in SELECTCOLUMNS(filter(t3,[Flag]=TRUE()),"sc",[sc]),1,0)

Si mi respuesta fue útil, considere Aceptarla como la solución para ayudar a los demás miembros a encontrarla.

Haga clic en el icono de Thumbs-Up si le gusta esta respuesta

VikramBasriyar

En respuesta a Anónimo

@Anónimo: Incluir la selección de la cantina en el informe.

Cambie la medida con el siguiente código ahoraC7.PNG:

Measure = 
var t2=SELECTCOLUMNS(t1,"sc",t1[School],"Flag",IF(ISBLANK(t1[Finish]),FALSE(),t1[Finish]>= SELECTEDVALUE('Date'[Date])&&t1[Start]<= SELECTEDVALUE('Date'[Date])))

var t3=SELECTCOLUMNS(t1,"sc",t1[School],"Flag",IF(ISBLANK(t1[Finish]),FALSE(),t1[Type]= SELECTEDVALUE(t1[Type])))

return
SWITCH(TRUE(),NOT(SELECTEDVALUE(School[School])) in SELECTCOLUMNS(filter(t2,[Flag]=TRUE()),"sc",[sc])  &&  NOT(SELECTEDVALUE(School[School])) in SELECTCOLUMNS(filter(t3,[Flag]=TRUE()),"sc",[sc]),1,0)

Si mi respuesta fue útil, considere Aceptarla como la solución para ayudar a los demás miembros a encontrarla.

Haga clic en el icono de pulgar hacia arriba si le gusta esta respuesta

VikramBasriyar

En respuesta a VikramBasriyar

Si mi respuesta fue útil, considere Aceptarla como la solución para ayudar a los demás miembros a encontrarla.

Haga clic en el icono de Thumbs-Up si le gusta esta respuesta

Rocco_sprmnt21

intente usar esta función:

let 
    notCanteen=(d)=> Text.Combine( List.Distinct(Table.SelectRows(school, each d<[Start] or d>[Finish])[School]), ",") 

in
    notCanteen

image.png

image.png

Anónimo

En respuesta a Rocco_sprmnt21

Hola @ Rocco_sprmnt21

Seleccionó el 2 de enero y se muestran las escuelas A, B y D, pero yo quería que se mostraran las escuelas B, C y E.
El corte de las fechas también debe estar en el informe y no en el editor de PowerQuery.

Saludos cordiales
Louise

Rocco_sprmnt21

En respuesta a Anónimo

Hola @Anónimo

Corregí el guión para que coincida con tus datos.

image.png

echa un vistazo a la última publicación

Jimmy801

Hola @Anónimo

tienes que crear una fila por cada día que la cantina esté abierta. Esto se puede lograr creando una lista de fechas de cada fila (de modo que la lista contenga los días en los que el comedor está abierto) y expandirlos a nuevas filas. Aquí un ejemplo de cómo se ve esto

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WclTSUTIw1AMiIwMg09AUwVSK1UGWN7SEy0OYaPJgTcYGegbGEKYRWN6JgH5nIAuKYFzszoEY5wKRNzSCmAFSaoTsXFck42IB", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [School = _t, Start = _t, Finish = _t, Type = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"School", type text}, {"Start", type date, "de-DE"}, {"Finish", type date, "de-DE"}, {"Type", Int64.Type}}),
    AddListOfDates = Table.AddColumn
    (
        #"Changed Type",
        "Dates",
        (add)=> if add[Start]<> null and add[Finish]<> null then List.Dates(add[Start], Duration.Days(add[Finish]-add[Start])+1, #duration(1,0,0,0)) else null
    ),
    ExpandToRows = Table.ExpandListColumn(AddListOfDates, "Dates")
in
    ExpandToRows

Copie y pegue este código en el editor avanzado en una nueva consulta en blanco para ver cómo funciona la solución.
Si esta publicación ayuda o resuelve su problema, márquelo como solución (para ayudar a otros usuarios a encontrar contenido útil y reconocer el trabajo de los usuarios que lo ayudaron)
Los kudoes también son agradables

Divertirse

Palanqueta

Anónimo

En respuesta a Jimmy801

Hola @ Jimmy801

Esto me ayuda a mostrar a las escuelas que tienen comedor abierto las fechas concretas, sí.

Sin embargo, lo que busco son los colegios que NO tengan comedor abierto en esas fechas concretas.

Saludos cordiales Louise

Jimmy801

En respuesta a Anónimo

Hola @Anónimo

Yo no vi eso 🙂

Aquí ahora un ejemplo de las fechas cerradas. Sin embargo, debe especificar en algún lugar el rango de fechas. Hice eso en el paso ListOfDatesForEvaluation

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WclTSUTIw1AMiIwMg09AUwVSK1UGWN7SEy0OYaPJgTcYGegbGEKYRWN6JgH5nIAuKYFzszoEY5wKRNzSCmAFSaoTsXFck42IB", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [School = _t, Start = _t, Finish = _t, Type = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"School", type text}, {"Start", type date, "de-DE"}, {"Finish", type date, "de-DE"}, {"Type", Int64.Type}}),
    ListOfDatesForEvaluation = List.Dates(#date(2018,1,1), 1200,#duration(1,0,0,0)),
    AddListOfDates = Table.AddColumn
    (
        #"Changed Type",
        "Dates closed",
        (add)=> if add[Start]<> null and add[Finish]<> null then List.Difference(ListOfDatesForEvaluation, List.Dates(add[Start], Duration.Days(add[Finish]-add[Start])+1, #duration(1,0,0,0))) else ListOfDatesForEvaluation
    ),
    ExpandToRows = Table.ExpandListColumn(AddListOfDates, "Dates closed")
in
    ExpandToRows

Copie y pegue este código en el editor avanzado en una nueva consulta en blanco para ver cómo funciona la solución.

Si esta publicación ayuda o resuelve su problema, márquelo como solución (para ayudar a otros usuarios a encontrar contenido útil y reconocer el trabajo de los usuarios que lo ayudaron)
Los kudoes son agradable tambien

Divertirse

Palanqueta

Anónimo

En respuesta a Jimmy801

Hola @ Jimmy801

Casi funcionó. La cosa es que cuando corte el 2 de enero, aparece la escuela A (debido a la fila A, 01.01.2019, 15.01.2019, 1).

Saludos cordiales Louise.

Rocco_sprmnt21

En respuesta a Anónimo

está bien.

pruebe esto ahora

let 
    notCanteen=(d)=>
    let 
    schools=List.Distinct(school[School]),
    snic=Text.Combine( List.Difference(schools,List.Distinct(Table.SelectRows(school, each d>[Start] and d<[Finish])[School])), ",") 
    in snic
in
    notCanteen

escuela es el nombre de la consulta que contiene su tabla

Anónimo

En respuesta a Rocco_sprmnt21

Hola @ Rocco_sprmnt21

¡¡Esto funcionó !!
Sin embargo, es el usuario final de los informes quien se supone que debe dividir las fechas (lo que significa que la división no puede ocurrir en el editor de Power Query) …

Jimmy801

En respuesta a Anónimo

Hola @Anónimo

por lo tanto, necesita la tabla como estaba diciendo. Una tabla que tiene para cada combinación Escuela / Tipo Comedor / y días libres seguidos. Entonces, el usuario final puede filtrar esto en un visual

Espero que ayude

Palanqueta

Rocco_sprmnt21

En respuesta a Anónimo

<< ..

¡¡Esto funcionó !!
Sin embargo, es el usuario final de los informes quien se supone que debe dividir las fechas (lo que significa que la división no puede ocurrir en el editor de Power Query) …

.. >>

Hola @Anónimo

Habiendo publicado el problema en la sección Power Query, pensé que necesitábamos una solución en el contexto de Power query.
No entiendo a qué interfaz se refiere.
Si explica los detalles de lo que espera, alguien (probablemente no yo) puede ayudarlo.

Rocco_sprmnt21

En respuesta a Rocco_sprmnt21

es solo una solución alternativa a lo que entendí de sus «especificaciones»

let
    notCanteen=(d)=>
    let 
    schools=List.Distinct(school[School]),
    nc=Text.Combine( List.Difference(schools,List.Distinct(Table.SelectRows(school, each d>[Start] and d<[Finish])[School])), ",") 
    in nc,

    Source = Table.FromValue(notCanteen),
    #"Added Custom1" = Table.AddColumn(Source, "Day", each {1..31}),
    #"Added Custom2" = Table.AddColumn(#"Added Custom1", "Month", each {1..12}),
    #"Expanded Day" = Table.ExpandListColumn(#"Added Custom2", "Day"),
    #"Expanded Month" = Table.ExpandListColumn(#"Expanded Day", "Month"),
    #"Added Custom" = Table.AddColumn(#"Expanded Month", "nic", each [Value](#date(2020,[Month],[Day]))),
    #"Filtered Rows" = Table.SelectRows(#"Added Custom", each ([Day] = 2) and ([Month] = 1))
in
    #"Filtered Rows"

en esta consulta usted (o su usuario) puede filtrar el día y el mes y obtener la lista de la escuela deseada (peraphs)

Rocco_sprmnt21

En respuesta a Anónimo

Puede agregar una columna con estos datos usando la función y de esta manera el usuario puede filtrar como quiera

Deja un comentario

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