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.
v-alq-msft
Hola, @Anónimo
Basándome en tu descripción, creé datos para reproducir tu escenario. El archivo pbix se adjunta al final.
Tabla:
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.
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.
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 ahora:
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
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.
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