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

Register now to learn Fabric in free live sessions led by the best Microsoft experts. From Apr 16 to May 9, in English and Spanish.

Reply
mihai_enache
Frequent Visitor

Cuente con múltiples criterios

Hola

Soy bastante nuevo con Power BI y me encontré con una situación que no sé cómo resolver.

Tengo 2 tablas: una con usuarios que contiene el ID de usuario y 4 criterios

ID de usuarioPresupuestoBarriosNúmero de habitacionesProximidad a la estación de metro
110000A, B, C, D1, 25 minutos
25000A, E, J, K115 minutos
33000B, C, D, E310 minutos
410000A, B, C, D, E3no es importante
511000A, E3, 4no es importante
67000A, B1, 2, 3, 410 minutos

Y uno con apartamentos

ID de apartamentoPrecioBarrioNúmero de habitacionesProximidad a la estación de metro
19750A25 minutos
24000A410 minutos
32550E315 minutos
44550B310 minutos
57550C1fuera de alcance
66000A110 minutos

Para cada tabla, necesito crear la 6a columna:

  • en la tabla Usuario, para cada usuario, quiero ver cuántos apartamentos le quedan
ID de usuarioPresupuestoBarriosNúmero de habitacionesProximidad a la estación de metroNúmero de apartamentos según criterios
110000A, B, C, D1, 25 minutos1 (apt 1,6)
25000A, E, J, K115 minutos0
33000B, C, D, E310 minutos0
410000A, B, C, D, E3no es importante2 (apt 3,4)
511000A, E3, 4no es importante2 (apt 2,3)
67000A, B1, 2, 3, 410 minutos3 (apt 2,4,6)
  • en la mesa de apartamentos, para cada apartamento, quiero ver cuántos usuarios son adecuados para ellos.
ID de apartamentoPrecioBarrioNúmero de habitacionesProximidad a la estación de metroNúmero de personas según criterios
19750A25 minutos1 (usuario 1)
24000A410 minutos2 (usuarios 5, 6)
32550E315 minutos2 (usuarios 4,5)
44550B310 minutos2 (usuarios 4,6)
57550C1fuera de alcance0
66000A110 minutos1 (usuario 6)

Algunas complejidades:

  • en la tabla de usuarios, los barrios y el número de habitaciones se apilan (ver tabla)
  • en la tabla de usuario, la distancia al metro es máxima por lo que si un usuario selecciona 15 minutos, todos los apartamentos a 5, 10 y 15 minutos son adecuados para él. Para los usuarios que dicen que no es importante > que obtener todos los apartamentos.
  • en la mesa de apartamentos, si un apartamento está fuera de alcance, es adecuado sólo para aquellos usuarios que dicen que el metro no es importante

Gracias por su ayuda

Mihai

2 ACCEPTED SOLUTIONS
AlB
Super User
Super User

No @mihai_enache

Se puede hacer en DAX también siguiendo una lógica similar. Aquí hay una posible solución en M, donde ApartmentsT es el nombre de su mesa de apartamentos. Ver todo en el trabajo en el archivo adjunto.

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMlTSUTI0AAIg7aij4KSj4Kyj4AIS1FEwAlKmCrmZeaUlqcVKsTrRSmARuGJXHQUvHQVvkGIQRlVqDBQyhiiFGgrUABIDW4ii1ASrGxDK8/JLFDJzC/KLShLzSsA6TEE6DBEOASnUUTDBqtYMKGqOMBzqNR0FqAZkt8QCAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [#"User ID" = _t, Budget = _t, Neighbourhoods = _t, #"Number of rooms" = _t, #"Proximity to metro station" = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"User ID", Int64.Type}, {"Budget", Int64.Type}, {"Neighbourhoods", type text}, {"Number of rooms", type text}, {"Proximity to metro station", type text}}),
    #"Added Custom" = Table.AddColumn(#"Changed Type", "Numb apartments meeting criteria", each Table.RowCount(Table.SelectRows(ApartmentsT,
      (inner)=> inner[Price]<=[Budget] and Text.Contains([Neighbourhoods], inner[Neighbourhood])
       and Text.Contains([Number of rooms], Text.From(inner[Number of rooms])) 
       and (if [Proximity to metro station] = "not important" then true else if inner[Proximity to metro station]="out of range" then false 
        else if Number.FromText(Text.BeforeDelimiter(inner[Proximity to metro station]," minutes")) <= Number.FromText(Text.BeforeDelimiter([Proximity to metro station]," minutes")) then true else false))))
in
    #"Added Custom"

Por favor, marque la pregunta resuelta cuando haya terminado y considere dar un pulgar hacia arriba si las publicaciones son útiles.

Póngase en contacto conmigo de forma privada para obtener asistencia con cualquier necesidad de BI a gran escala, tutoría, etc.

Salud

SU18_powerbi_badge

View solution in original post

AlB
Super User
Super User

@mihai_enache

Pruebe esto para la columna personalizada

    #"Added Custom" = Table.AddColumn(#"Changed Type", "Custom", each Table.RowCount(Table.SelectRows(Apartamente,
      (inner)=> inner[#"Pret cu TVA calculat"]<=[#"Buget maxim disponibil"] and 
      (if [#"Zone de interes:"]=null then true else if inner[#"Zona"]=null then false else Text.Contains([#"Zone de interes:"], inner[#"Zona"]))
       and Text.Contains([#"Cauti un apartament cu ..... camere"], Text.From(inner[#"Numar camere (numar)"])) 
       and (if List.Contains({null,"nu este important"},[#"Distanta metrou (bifeaza optiunea maxim acceptabila): "]) then true else if inner[#"Distanta fata de metrou"]="Peste 20 minute" then false 
        else if inner[#"Distanta fata de metrou"] = "peste 20 minute" then false else
        if Number.FromText(List.Max(Text.Split(Text.BeforeDelimiter(inner[#"Distanta fata de metrou"]," minute"),"-"))) <= Number.FromText(List.Max(Text.Split(Text.BeforeDelimiter([#"Distanta metrou (bifeaza optiunea maxim acceptabila): "]," minute"),"-"))) then true else false
        ))))

Es posible que tenga que ajustar un poco para adaptarlo completamente a sus necesidades. Véalo en el archivo adjunto

Por favor, marque la pregunta resuelta cuando haya terminado y considere dar un pulgar hacia arriba si las publicaciones son útiles.

Póngase en contacto conmigo de forma privada para obtener asistencia con cualquier necesidad de BI a gran escala, tutoría, etc.

Salud

SU18_powerbi_badge

View solution in original post

6 REPLIES 6
mihai_enache
Frequent Visitor

Hey @AlB

¡Funciona! Todavía necesito ajustarlo, como dijiste, pero los datos están ahí.

Gracias por tu ayuda.

AlB
Super User
Super User

@mihai_enache

Pruebe esto para la columna personalizada

    #"Added Custom" = Table.AddColumn(#"Changed Type", "Custom", each Table.RowCount(Table.SelectRows(Apartamente,
      (inner)=> inner[#"Pret cu TVA calculat"]<=[#"Buget maxim disponibil"] and 
      (if [#"Zone de interes:"]=null then true else if inner[#"Zona"]=null then false else Text.Contains([#"Zone de interes:"], inner[#"Zona"]))
       and Text.Contains([#"Cauti un apartament cu ..... camere"], Text.From(inner[#"Numar camere (numar)"])) 
       and (if List.Contains({null,"nu este important"},[#"Distanta metrou (bifeaza optiunea maxim acceptabila): "]) then true else if inner[#"Distanta fata de metrou"]="Peste 20 minute" then false 
        else if inner[#"Distanta fata de metrou"] = "peste 20 minute" then false else
        if Number.FromText(List.Max(Text.Split(Text.BeforeDelimiter(inner[#"Distanta fata de metrou"]," minute"),"-"))) <= Number.FromText(List.Max(Text.Split(Text.BeforeDelimiter([#"Distanta metrou (bifeaza optiunea maxim acceptabila): "]," minute"),"-"))) then true else false
        ))))

Es posible que tenga que ajustar un poco para adaptarlo completamente a sus necesidades. Véalo en el archivo adjunto

Por favor, marque la pregunta resuelta cuando haya terminado y considere dar un pulgar hacia arriba si las publicaciones son útiles.

Póngase en contacto conmigo de forma privada para obtener asistencia con cualquier necesidad de BI a gran escala, tutoría, etc.

Salud

SU18_powerbi_badge

AlB
Super User
Super User

@mihai_enache

"No funcionaba"

Gran. Eso realmente es una gran cantidad de información para ayudar a buscar el problema

Si acabas de replicar lo que hice, debería funcionar. Estás usando "minutos"

Number.FromText(Text.BeforeDelimiter([#"Metrou"]," minutes")

¿No necesitas adaptar eso al idioma que estás usando?

Como dije antes, explica lo que no funciona. O aísle los varios pasos del código para identificar cuál no funciona. O comparta el pbix real o uno con datos ficticios que reproducen el problema

Por favor, marque la pregunta resuelta cuando haya terminado y considere dar un pulgar hacia arriba si las publicaciones son útiles.

Póngase en contacto conmigo de forma privada para obtener asistencia con cualquier necesidad de BI a gran escala, tutoría, etc.

Salud

SU18_powerbi_badge

No @AlB

Lamento la falta de detalles. Es mi primer mensaje aquí y soy bastante nuevo en el trabajo con Power BI.

He creado un archivo pbix que estoy enviando aquí (no puedo cargarlo directamente)

El primer problema fue, como usted mencionó, no transformar "minutos" a "minuto". Ahora, el segundo problema tiene que ver con la distancia al metro - En realidad utilicé un ejemplo defectuoso porque en mi archivo, tengo intervalos de tiempo (por ejemplo, 5-10 minutos), así que muy probablemente, este es el último problema restante.

Además, para el otro camino (número de personas que se adaptan a cada apartamento) debo usar la misma fórmula?

Este es el enlace al archivo pbix

Gracias por su ayuda y me aplaudo de nuevo por mis inexactidades

Mihai

AlB
Super User
Super User

No @mihai_enache

Se puede hacer en DAX también siguiendo una lógica similar. Aquí hay una posible solución en M, donde ApartmentsT es el nombre de su mesa de apartamentos. Ver todo en el trabajo en el archivo adjunto.

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMlTSUTI0AAIg7aij4KSj4Kyj4AIS1FEwAlKmCrmZeaUlqcVKsTrRSmARuGJXHQUvHQVvkGIQRlVqDBQyhiiFGgrUABIDW4ii1ASrGxDK8/JLFDJzC/KLShLzSsA6TEE6DBEOASnUUTDBqtYMKGqOMBzqNR0FqAZkt8QCAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [#"User ID" = _t, Budget = _t, Neighbourhoods = _t, #"Number of rooms" = _t, #"Proximity to metro station" = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"User ID", Int64.Type}, {"Budget", Int64.Type}, {"Neighbourhoods", type text}, {"Number of rooms", type text}, {"Proximity to metro station", type text}}),
    #"Added Custom" = Table.AddColumn(#"Changed Type", "Numb apartments meeting criteria", each Table.RowCount(Table.SelectRows(ApartmentsT,
      (inner)=> inner[Price]<=[Budget] and Text.Contains([Neighbourhoods], inner[Neighbourhood])
       and Text.Contains([Number of rooms], Text.From(inner[Number of rooms])) 
       and (if [Proximity to metro station] = "not important" then true else if inner[Proximity to metro station]="out of range" then false 
        else if Number.FromText(Text.BeforeDelimiter(inner[Proximity to metro station]," minutes")) <= Number.FromText(Text.BeforeDelimiter([Proximity to metro station]," minutes")) then true else false))))
in
    #"Added Custom"

Por favor, marque la pregunta resuelta cuando haya terminado y considere dar un pulgar hacia arriba si las publicaciones son útiles.

Póngase en contacto conmigo de forma privada para obtener asistencia con cualquier necesidad de BI a gran escala, tutoría, etc.

Salud

SU18_powerbi_badge

Hola @AlB ,

Muchas gracias por su respuesta. Veo que está trabajando de su lado, pero no lo lo hice replicar el modelo en mis tablas.

Algunos detalles más de lo que hice:

1. Traje a través de columnas calculadas la "proximidad al metro" y "vecindario" en la tabla de apartamentos (ya que la información está en una 3a tabla denominada proyectos residenciales)

2. En la tabla Usuarios, intenté crear una nueva columna con el código exacto que usó y cambiar los nombres de las columnas, pero no funcionó

Este es el código que usé:

Table.RowCount(Table.SelectRows(#"Apartamente (2)",
      (inner)=> inner[#"Pret cu TVA calculat"]<=[#"Buget maxim disponibil"] and Text.Contains([#"Zone de interes:"], inner[#"Zona"])
       and Text.Contains([#"Cauti un apartament cu ..... camere"], Text.From(inner[#"Numar camere (numar)"])) 
       and (if [#"Distanta metrou (bifeaza optiunea maxim acceptabila): "] = "nu este important" then true else if inner[#"Metrou"]="Peste 20 minute" then false 
        else if Number.FromText(Text.BeforeDelimiter(inner[#"Distanta metrou (bifeaza optiunea maxim acceptabila): "]," minutes")) <= Number.FromText(Text.BeforeDelimiter([#"Metrou"]," minutes")) then true else false)))

¿Puedes decirme qué hice mal?

Muchas gracias por su ayuda

Mihai

Helpful resources

Announcements
Microsoft Fabric Learn Together

Microsoft Fabric Learn Together

Covering the world! 9:00-10:30 AM Sydney, 4:00-5:30 PM CET (Paris/Berlin), 7:00-8:30 PM Mexico City

PBI_APRIL_CAROUSEL1

Power BI Monthly Update - April 2024

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

April Fabric Community Update

Fabric Community Update - April 2024

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

Top Solution Authors