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
Syndicate_Admin
Administrator
Administrator

Intentar recrear una columna calculada en una medida

Hola. Perdón por el título anodino, no se me ocurrió nada más que poner. Voy a tratar de explicar mi problema en detalle, porque tal vez se te ocurra una idea mejor que la que estoy preguntando en este post:

Tengo esta tabla:

Fecha (dd-mm-aaaa)||Usuario||Región||Region_America||País||Año de cohorte||Primera Orden América||Rango
01/03/2021||Marx||Europa||Falso||Italia||202103||No||0
01/06/2021||Marx||Asia||Falso||China||202106||No||0
01/09/2021||Marx||América||Verdadero||Brasil||202109||||1
05/09/2021||Marx||América||Verdadero||Bolivia||202109||No||2
07/09/2021||Marx||América||Verdadero||Argentina||202109||No||3
09/12/2021||Marx||Europa||Falso||España||202122||No||0

Esta tabla es una lista de usuarios que han comprado, mostrando la región, país, etc.

La columna "Rango" me dice cuántos en orden ascendente, cuántas veces un usuario compró dentro de los 30 días, sesgados por región:

Rango = 
Dónde user_ = Tabla[Usuario]
Dónde min_date_ = CALCULAR(MIN(Tabla[fecha]), FILTRO(TODOSELECCIONADO(Tabla), Tabla[Usuario]=user_ && Tabla[First Order America]=VERDADERO()))
Dónde between_30_Days = SI(Tabla[Fecha]<=min_date_+30, VERDADERO(), FALSO())
DEVOLUCIÓN
SI(between_30_Days=VERDADERO() && Tabla[Region_America]
, RANKX(FILTRO(TODOSELECCIONADO(Tabla), Tabla[Region_America] && Tabla[Usuario]=customer_ && between_30_Days)
,Tabla[Fecha]
,
,ASC
,Denso)
,0)

Entonces, quiero saber cuántos usuarios tuvieron dos compras en 30 días, es decir, cuántos usuarios tienen rango = 2. Lo hago con esto:

Medida =
Dónde cohort_ = VALOR SELECCIONADO(Tabla[AñoMes])
Dónde column_ = VALOR SELECCIONADO(Fecha[Día])
DEVOLUCIÓN
CALCULAR
(DISTINCTCOUNT(Tabla[Usuario])
,FILTRO(TODOSELECCIONADO(tabla), tabla[año de cohorte]=cohort_ && tabla[rango]=2 && Relacionado(Tabla[Día])=column_)

(hay algunas columnas que no están incluidas en la tabla anterior, ya era demasiado larga)

Hasta aquí todo bien, mi problema es el siguiente: si en la parte visual quiero añadir una cortadora/filtro, por ejemplo, por país, la lógica que utilicé no funcionará. Ejemplo: Inserto una segmentación por país y selecciono "Bolivia". Mi medida sería contar la siguiente fila:

05/09/2021 Marx América Verdadero Bolivia 202109 No 2

Lo cual está mal. Esto no me está indicando que el usuario compró dos veces, en 30 días, en Bolivia, pero aún cuenta.

Entonces, dado que una columna no puede ser dinámica y depender de un "valor seleccionado" (o al menos eso es lo que entiendo), mi idea sería recrear la columna "rank" en la medida "medida", para poder filtrar por país correctamente y si en el futuro quiero agregar otras columnas (por ejemplo por género, edad, provincia, etc.), y busco filtrarlos por esas columnas, no tendría ningún problema.

¿Es esto posible? No podía pensar en una manera de hacer que lo que digo funcionara

Perdón por el largo post, escribí las medidas que utilicé porque tal vez se te ocurra una mejor manera de enfrentar la situación, sin tener que "recrear" la columna de rango en una medida.

Gracias 🙂

4 REPLIES 4
Syndicate_Admin
Administrator
Administrator

Hi , @cris1196

Su comprensión es correcta, nuestras columnas calculadas no pueden verse afectadas por las segmentaciones de datos. Por ahora, su expectativa es reescribir sus columnas rankx usando el método de medida.

Estos son los pasos que puede consultar:
(1) Estos son mis datos de prueba:

vyueyunzhmsft_0-1675318777773.png

(2) Podemos crear una medida como esta:

Measure = var _cur_user = MAX('Table'[User])
var _mindate = MINX(FILTER( ALLSELECTED('Table') ,'Table'[User] =_cur_user && 'Table'[First Order America]="Yes"),[Date (dd-mm-yyyy)])
var _cur_date = MAX('Table'[Date (dd-mm-yyyy)])
var _region_america=SELECTEDVALUE('Table'[Region_America])
var _rankx = RANKX( FILTER(ALLSELECTED('Table'),'Table'[User]=_cur_user && 'Table'[Region_America]=TRUE()) , CALCULATE( MAX('Table'[Date (dd-mm-yyyy)])),,ASC,Dense)
return
IF(_cur_date<=_mindate+30 && _region_america=TRUE(),_rankx,0)

(3) Entonces podemos poner la medida en lo visual y satisfacer su necesidad:

vyueyunzhmsft_1-1675318882785.png

Si este método no satisface sus necesidades, puede proporcionarnos sus datos de muestra especiales y los datos de muestra de salida deseados en forma de tablas, para que podamos ayudarlo a resolver mejor el problema.

Gracias por su tiempo y uso compartido, y gracias por su apoyo y comprensión de PowerBI.

Saludos

Dijo Zhang

Si esta publicación ayuda, considere Aceptarlo como la solución para ayudar a los otros miembros a encontrarlo más rápidamente.

Gracias por responder. Desafortunadamente no funcionó para mí. Aquí están mis datos de muestra con datos generados aleatoriamente:

Enlace



Para explicarme mejor: centrémonos en la fila 202204 y la columna 28: según mis cálculos, hay 30 usuarios que están de acuerdo con mi medida, lo cual es correcto.

Ahora vamos a filtrar por Store_ID = 5, usando el Slicer: ahora tenemos 7 valores para esas coordenadas

cris1196_0-1675401851069.png

Lo cual está mal. Uno de los siete usuarios es "017fc519b5170bcc", que aparece porque realmente cumple con los requisitos de mi medida, el problema es que lo que quiero indicar con Slicer Region = Europe y Slicer Store_Id = 5, es "este usuario compró 2 veces en region = Europe, Store_Id = 5".

Es decir, el resultado final debería ser 6, no 7-->otros usuarios, si miramos de cerca, realmente compraron dos veces, en menos de 30 días, en Store_Id = 5, pero nuestro usuario "017fc519b5170bcc", compró primero en 207 y luego en 5.

Para que se entienda mejor, una solución fácil a esto (pero imposible), sería, para la columna calculada "Rank Europe Buy", ser filtrada por el slicer y luego hacer el cálculo, pero como no hay columnas dinámicas filtradas por el slicer, tengo que hacer una medida que cumpla la misma función.


Con el cálculo que me diste, desafortunadamente no pude hacerlo funcionar 😔


Sé que se podría hacer creando más columnas, pero tendría que crear muchas más (una para cada Store_ID) que es... bueno, no es óptimo. Ni siquiera sé si lo que estoy pidiendo es posible, soy nuevo en PBI y a veces pienso que quiero hacer cosas que actualmente no son posibles 😅

PD: Disculpe mi gramática, entiendo bien el inglés pero cometo varios errores gramaticales

Hi , @cris1196

¡Gracias por su rápida respuesta!

Pruebo sus datos de muestra en mi lado.

Para ello, creo que es necesario recrear la medida tanto en la matriz visual.

Creo dos medidas como esta:

Measure rankx = var _cur_user = MAX('Table'[User])
var _mindate = MINX(FILTER( ALLSELECTED('Table') ,'Table'[User] =_cur_user && 'Table'[First Buy Europe]=TRUE()),[Date])
var _cur_date = MAX('Table'[Date])
var _region_america=SELECTEDVALUE('Table'[Region Europe2])
var _rankx = RANKX( FILTER(ALLSELECTED('Table'),'Table'[User]=_cur_user && 'Table'[Region Europe2]=TRUE()) , CALCULATE( MAX('Table'[Date])),,ASC,Dense)
return
IF(_cur_date<=_mindate+30 && _region_america=TRUE(),_rankx,0)
Measure Count Test = 
var cohort_week = SELECTEDVALUE('Date'[Cohort Month])
var days = SELECTEDVALUE('Table'[Datediff Europe])
var _t =SUMMARIZE( 'Table' , 'Table'[User] , 'Table'[Date] , 'Table'[First Buy Europe],'Table'[Region Europe2] , "rankx" , [Measure rankx])
var _t2 = SELECTCOLUMNS(FILTER( _t ,[rankx]=2),"user" , [User])
 return
 COUNTROWS( DISTINCT(_t2))
// CALCULATE(DISTINCTCOUNT('Table'[User]),FILTER(ALLSELECTED('Table'), 'Table'[Cohort Month First Order Europe]=cohort_week && 'Table'[Rank Europe Buy]=2 && 'Table'[Datediff Europe]=days))

Entonces podemos obtener el resultado de la siguiente manera:

vyueyunzhmsft_0-1675406154899.png

Gracias por su tiempo y uso compartido, y gracias por su apoyo y comprensión de PowerBI.

Saludos

Dijo Zhang

Si esta publicación ayuda, considere Aceptarlo como la solución para ayudar a los otros miembros a encontrarlo más rápidamente.

¡Guau, funciona! Nunca se me hubiera ocurrido usar "resumir" para lograr esto.

Ahora voy a estudiar qué lógica hiciste 😁

¡Gracias!

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.