Find everything you need to get certified on Fabric—skills challenges, live sessions, exam prep, role guidance, and a 50 percent discount on exams.
Get startedEarn a 50% discount on the DP-600 certification exam by completing the Fabric 30 Days to Learn It challenge.
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 usuario | Presupuesto | Barrios | Número de habitaciones | Proximidad a la estación de metro |
1 | 10000 | A, B, C, D | 1, 2 | 5 minutos |
2 | 5000 | A, E, J, K | 1 | 15 minutos |
3 | 3000 | B, C, D, E | 3 | 10 minutos |
4 | 10000 | A, B, C, D, E | 3 | no es importante |
5 | 11000 | A, E | 3, 4 | no es importante |
6 | 7000 | A, B | 1, 2, 3, 4 | 10 minutos |
Y uno con apartamentos
ID de apartamento | Precio | Barrio | Número de habitaciones | Proximidad a la estación de metro |
1 | 9750 | A | 2 | 5 minutos |
2 | 4000 | A | 4 | 10 minutos |
3 | 2550 | E | 3 | 15 minutos |
4 | 4550 | B | 3 | 10 minutos |
5 | 7550 | C | 1 | fuera de alcance |
6 | 6000 | A | 1 | 10 minutos |
Para cada tabla, necesito crear la 6a columna:
ID de usuario | Presupuesto | Barrios | Número de habitaciones | Proximidad a la estación de metro | Número de apartamentos según criterios |
1 | 10000 | A, B, C, D | 1, 2 | 5 minutos | 1 (apt 1,6) |
2 | 5000 | A, E, J, K | 1 | 15 minutos | 0 |
3 | 3000 | B, C, D, E | 3 | 10 minutos | 0 |
4 | 10000 | A, B, C, D, E | 3 | no es importante | 2 (apt 3,4) |
5 | 11000 | A, E | 3, 4 | no es importante | 2 (apt 2,3) |
6 | 7000 | A, B | 1, 2, 3, 4 | 10 minutos | 3 (apt 2,4,6) |
ID de apartamento | Precio | Barrio | Número de habitaciones | Proximidad a la estación de metro | Número de personas según criterios |
1 | 9750 | A | 2 | 5 minutos | 1 (usuario 1) |
2 | 4000 | A | 4 | 10 minutos | 2 (usuarios 5, 6) |
3 | 2550 | E | 3 | 15 minutos | 2 (usuarios 4,5) |
4 | 4550 | B | 3 | 10 minutos | 2 (usuarios 4,6) |
5 | 7550 | C | 1 | fuera de alcance | 0 |
6 | 6000 | A | 1 | 10 minutos | 1 (usuario 6) |
Algunas complejidades:
Gracias por su ayuda
Mihai
Solved! Go to Solution.
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
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
Hey @AlB
¡Funciona! Todavía necesito ajustarlo, como dijiste, pero los datos están ahí.
Gracias por tu ayuda.
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
"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
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
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
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