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

Find everything you need to get certified on Fabric—skills challenges, live sessions, exam prep, role guidance, and more. Get started

Reply
Syndicate_Admin
Administrator
Administrator

Crear una nueva columna calculada para un índice de valores filtrados

Hola

Estoy tratando de crear una columna calculada que crea un índice basado en los valores filtrados. Tengo un índice en mi tabla sin filtrar y lo estoy usando para calcular el rango como se muestra a continuación:

FilteredIndex = 
RANKX(
    ALLSELECTED('MyTable'),
    'MyTable'[Index],
    ,
    ASC,
    DENSE
)

Sin embargo, cuando selecciono una opción en una segmentación de datos para filtrar los datos, la columna FilteredIndex se muestra igual que la columna Index. Sé que la segmentación está funcionando a medida que la tarjeta "Tabla" se actualiza para mostrar solo las filas seleccionadas.

Un gif tomado de otra publicación del foro que muestra exactamente lo que quiero está a continuación. Sin embargo, el código sugerido en esa publicación me da un error de referencia circular.

mrchips_0-1722714904443.gif

¡Cualquier ayuda sobre cómo obtener este trabajo sería muy apreciada!

11 REPLIES 11
Syndicate_Admin
Administrator
Administrator

Hola @mrchips ,

Gracias @DataInsights por las ideas correctas y haré algunas adiciones.

Cuando se utiliza la función CALCULATE, convierte el contexto de fila actual en un contexto de filtrado. Si se utiliza CALCULATE en una columna calculada y no hay ninguna columna de clave principal para identificar de forma única cada fila, puede producirse una dependencia circular. Dentro de la fórmula, la función RANKX debe recorrer toda la tabla al calcular las clasificaciones, y cada fila de esta tabla depende del valor de FilteredIndex. Esto lleva a un bucle. Es posible trasladar la lógica computacional a la medida, ya que las medidas no causan dependencias circulares. Siga los siguientes pasos:

1.Crea un dato simple:

vlinhuizhmsft_0-1722825311348.png

2.Cree una nueva medida:

FilteredIndex =
RANKX (
    ALLSELECTED ( 'Table' ),
    CALCULATE ( SUM ( 'Table'[Index] ) ),
    ,
    ASC,
    DENSE
)

3. El resultado final es el siguiente:

vlinhuizhmsft_1-1722825405274.png

Saludos
Zhu
Equipo de apoyo a la comunidad

Si hay alguna publicación que ayude, considere Aceptarla como la solución para ayudar a los demás miembros a encontrarla más rápidamente.
Si no entiendo sus necesidades o aún tiene problemas con él, no dude en hacérnoslo saber. ¡Muchas gracias!

Syndicate_Admin
Administrator
Administrator

@mrchips,

Las columnas calculadas no pueden reconocer las selecciones de segmentación. Las medidas, sin embargo, reconocen las selecciones de segmentación.

Hola @DataInsights y @v-linhuizh-msft , gracias por sus consejos sobre esto. Sin embargo, me lleva directamente a otro tema.

Estoy usando la columna Índice para intentar calcular la suma acumulada de un número de filas que luego puedo comparar con un valor de control deslizante para elegir si incluirlas o no (es decir, iterar a través de las filas e "Incluirlas", hasta que la suma acumulada me lleve por encima del presupuesto). Esto funciona con la columna Índice para todos los datos, pero quiero que se vuelva a calcular esto si se filtran los datos.

Tener el índice filtrado como medida no me permite iterar sobre las filas y elegir qué incluir o no. Mis medidas son las siguientes:

RunningTotal = 
VAR CurrentIndex = 'Table'[Index]
VAR CurrentCost = 'Table'[Cost]
VAR Budget = 'Cost budget'[Cost budget Value]
VAR PreviousTotal = 
    CALCULATE(
        SUM('Table'[Cost]),
        FILTER(
            'Table',
            'Table'[Index] < CurrentIndex
        )
    )
RETURN
IF(PreviousTotal + CurrentCost <= Budget, PreviousTotal + CurrentCost, PreviousTotal)

IncludeFlag = 
VAR CurrentIndex = MAX('Table'[Index])
VAR Budget = 'Cost budget'[Cost budget Value]
VAR CumulativeCostAtCurrentIndex = 
    CALCULATE(
        SUM('Table'[CumulativeCost]),
        FILTER(
            'Table',
            'Table'[Index] = CurrentIndex
        )
    )
VAR NextCumulativeCost = 
    CALCULATE(
        SUM('Table'[CumulativeCost]),
        FILTER(
            'Table',
            'Table'[Index] = CurrentIndex + 1
        )
    )
RETURN
IF(
    CumulativeCostAtCurrentIndex <= Budget &&
    (NextCumulativeCost = BLANK() || NextCumulativeCost <= Budget),
    1,
    0
)

Cualquier consejo sobre cómo solucionar esto sería muy apreciado.

@mrchips,

Pruebe estas medidas:

Amount = SUM ( 'Table'[Amount] )
Amount Within Budget = 
// Show amount until cumulative sum of amount exceeds budget.
VAR Budget =
    MAX ( 'Cost Budget'[Cost budget value] )
VAR BaseTable =
    ALLSELECTED ( 'Table'[Category], 'Table'[Index] )
VAR CalcTable =
    ADDCOLUMNS (
        BaseTable,
        "@Amount", [Amount],
        "@CumulativeSum",
            SUMX (
                WINDOW ( 1, ABS, 0, REL, BaseTable, ORDERBY ( 'Table'[Index], ASC ) ),
                [Amount]
            )
    )
VAR FilterTable =
    FILTER ( CalcTable, [@CumulativeSum] <= Budget )
VAR CategoryToInclude =
    SELECTCOLUMNS ( FilterTable, "Category", 'Table'[Category] )
VAR Result =
    CALCULATE ( [Amount], KEEPFILTERS ( CategoryToInclude ) )
RETURN
    Result

Puede ajustar la variable Presupuesto en función de cómo obtenga el presupuesto en su modelo.

Datos de muestra:

DataInsights_0-1722875273533.png

DataInsights_1-1722875292362.png

Resultado:

DataInsights_2-1722875418380.png

-----

DataInsights_3-1722875431901.png

Hola @DataInsights ,

Muchas gracias por esto, es realmente útil. He tenido que modificarlo un poco por las siguientes razones:

- Mi "Categoría" no tiene una sola fila en la tabla, devuelve varias filas, por lo que necesito calcular la suma acumulada en función de eso.

- Mi cortadora es solo de selección única, por lo que tendré todas las categorías o una, nunca solo un puñado.

Mi medida ahora devuelve un número que es ligeramente menor que el del presupuesto que cambia con la selección de diferentes categorías y los diferentes valores de presupuesto, lo que me indica que está haciendo un cálculo correcto.

Mi última pregunta, ¿cómo puedo crear un formato condicional basado en esto? Idealmente, me gustaría cambiar el fondo de celda de las filas "Incluidas" y dejar las filas "No incluidas" como están. Tal como está, ni siquiera puedo hacer que la tabla no muestre las filas que no están incluidas. ¿Tienes alguna opinión al respecto?

Gracias de nuevo,

-

@mrchips,

Prefiero crear un formato condicional a través de medidas: te da más flexibilidad y puedes reutilizar la lógica. Elija el estilo de formato "Valor de campo" para aplicar el formato condicional.

Si pudieras compartir un pbix desinfectado (OneDrive, etcétera) con el resultado esperado, le echaré un vistazo.

Hola @DataInsights

Gracias por el consejo, he creado la siguiente medida que creo que hace lo que estabas sugiriendo. Sin embargo, recibo el error de que no puede encontrar [@CumulativeCost]. He buscado un poco en Google, pero no puedo ver cómo solucionar el problema en este caso.

Budget Filter = 
// Show amount until cumulative sum of amount exceeds budget.
VAR Budget = 'Cost budget'[Cost budget Value]
VAR BaseTable =
    ALLSELECTED ( 'Table'[Name], 'Table'[Index] )
VAR CalcTable =
    ADDCOLUMNS (
        BaseTable,
        "@Amount", 'Table'[Amount],
        "@CumulativeSum",
            SUMX (
                WINDOW ( 1, ABS, 0, REL, BaseTable, ORDERBY ( 'Table'[Index], ASC ) ),
                'Table'[Amount]
            )
    )

RETURN
    SWITCH(
        TRUE,
        [@CumulativeSum] <= Budget, "ORANGE",
        [@CumulativeSum] > Budget, "WHITE"
        )

@mrchips,

¿Esas medidas o referencias de columna están en su medida? Tenga en cuenta que en mi DAX uso MAX para obtener el presupuesto, y [Cantidad] es una medida. No veo [@CumulativeCost] en su DAX. No podrá hacer referencia a [@CumulativeSum] directamente en una expresión SWITCH porque es una columna que contiene varios valores.

Hola @DataInsights ,

- [Nombre] e [Índice] son columnas de mis datos originales.

- 'Presupuesto de costo' [Valor del presupuesto de costo] es una medida que toma el valor SELECCIONADO de un control deslizante (por lo que no creo que necesite MAX ya que ya es un escalar)

Cost budget Value = SELECTEDVALUE('Cost budget'[Cost budget])

- [Cantidad] es una medida según el código anterior

Escribí mal allí, el error se refería a [@CumulativeSum], no a [@CumulativeCost]. Estaba siguiendo la imagen de ejemplo que adjunto a continuación como guía. También probé el siguiente código en la parte inferior de la medida Filtro de presupuesto, pero todavía recibo varios errores de referencia.

VAR CalcSum = MAX(CalcTable[@CumulativeSum])

RETURN
    SWITCH(
        TRUE,
        CalcSum <= Budget, "ORANGE")

Example Code from https://blog.coupler.io/power-bi-conditional-formatting/#:~:text=Select%20the%20field%20to%20apply,based%20on%20the%20date%20values.Example Code from https://blog.coupler.io/power-bi-conditional-formatting/#:~:text=Select%20the%20field%20to%20apply,based%20on%20the%20date%20values.Código de ejemplo de https://blog.coupler.io/power-bi-conditional-formatting/#:~:text=Select%20the%20field%20to%20apply,b....

¿Es esto lo que estabas sugiriendo con una Medida y Valor de Campo como Formato Condicional o hay una forma alternativa?

@mrchips,

Una práctica recomendada que puede querer implementar es no preceder a los nombres de medida con una tabla. Esto hace que las medidas sean reconocibles al instante (las columnas van precedidas de su tabla).

Sí, esa es la idea con una medida de formato condicional. También puede usar códigos de color hexadecimales en lugar de nombres de color. La columna temporal [@CumulativeSum] solo es visible con su medida original; No podrá hacer referencia a él desde otra medida. Tenga en cuenta que hay tres variables después de CalcTable en mi DAX, lo que en última instancia da como resultado un escalar. ¿Está intentando suprimir filas que superan el presupuesto o simplemente resaltarlas?

Hola @DataInsights , perdón por la respuesta tan lenta.

Entendido en la mejor práctica, ¡lo implementaré!

Supongo que me gustaría tener una forma de hacer ambas cosas, pero por separado para cosas separadas. El resaltado es mi principal prioridad en este momento, ya que ya puedo suprimir las filas con la medida anterior.

Gracias

Helpful resources

Announcements
Europe Fabric Conference

Europe’s largest Microsoft Fabric Community Conference

Join the community in Stockholm for expert Microsoft Fabric learning including a very exciting keynote from Arun Ulag, Corporate Vice President, Azure Data.

AugPowerBI_Carousel

Power BI Monthly Update - August 2024

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

August Carousel

Fabric Community Update - August 2024

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

Top Solution Authors
Top Kudoed Authors