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

Filtro devuelto desde la instrucción Switch DAX

Hola

Tengo el siguiente código

Transactions Last FY = 
    VAR _selectedCurrency = SELECTEDVALUE('Selected Currency'[Currency Type])
    VAR _selectedPeriod = SELECTEDVALUE('Selected Period'[Period Type])
    
    VAR _filter = 
        SWITCH(_selectedPeriod,
               "Last Month", 
                FILTER ( ALL ('Date Table'[Is Last Year Last Month]), 'Date Table'[Is Last Year Last Month] = TRUE() ),
                "Current Month", 
                FILTER( ALL ( 'Date Table'[Is Last Year Current Month] ), 'Date Table'[Is Last Year Current Month] = TRUE() ),
                "Quarter to Date", 
                FILTER( ALL ( 'Date Table'[Is In Last FQTD] ), 'Date Table'[Is In Last FQTD] = TRUE() ),
                "Last Month Year to Date", 
                FILTER( ALL ( 'Date Table'[Is Complete Fiscal Month of Last FY] ), 'Date Table'[Is Complete Fiscal Month of Last FY] = TRUE() ),
                "Year to Date", 
                FILTER ( ALL ( 'Date Table'[Is In Last FYTD] ), 'Date Table'[Is In Last FYTD] = TRUE() )
            )
    RETURN 
        SWITCH(
            _selectedCurrency, 
            "Group Currency", CALCULATE ( [Transactions Last FY (Local Currency)], _filter ),
            "Local Currency", CALCULATE ( [Transactions Last FY (Group Currency)], _filter ),
            "Select a single currency type" )

Esto arroja error True/False expresión debe referirse exactamente a una columna.

¿Dónde está el error en el código?

Gracias

1 ACCEPTED SOLUTION
Syndicate_Admin
Administrator
Administrator

¿ @EBGAL

El problema principal aquí es la variable _filter y cómo se usa.

  1. SWITCH (y IF) no pueden devolver valores de tabla, solo valores escalares.
    Dentro de la expresión para _filter, cada una de las posibilidades dentro de la función SWITCH se evalúa en una tabla de una fila/una columna. Da la casualidad de que DAX convierte tablas 1x1 en escalares en los casos en que se espera un escalar. Dado que SWITCH solo puede devolver un escalar, el resultado es un valor escalar TRUE o FALSE. Si alguna de estas tablas tenía más de una fila o columna, se devolvería un error.
  2. Dado que _filter es un valor escalar igual a TRUE o FALSE, no se puede utilizar como argumento de filtro de CALCULATE. Si una expresión booleana se proporciona como argumento de filtro, debe contener una referencia de columna, de lo contrario no se puede interpretar como un filtro. Esto causa el error que mencionó.

¿Cómo solucionar esto?

Primero, como recomendación general, es posible que desee crear submedidas, para preservar su cordura. 🙂

De todos modos, aquí hay algunas ideas:

Opción 1: Crear una tabla de filtros condicionales con FILTER en su lugar

Dentro de la variable _filter, cree una unión cruzada de todas las combinaciones de las 5 columnas booleanas 'Tabla de fechas' y, a continuación, filtre esta tabla en función de _selectedPeriod. Además, debe agregar REMOVEFILTERS ( 'Tabla de fechas') como un argumento dentro de CALCULATE.

Además, para una expresión booleana, = TRUE () es equivalente a .

Entonces, en lugar de escribir 'Tabla de fechas'[Es el último año el mes pasado] = VERDADERO (), puede escribir 'Tabla de fechas'[Es el último año del mes pasado].

No me molesté en crear ninguna submedida aquí, pero esto ilustra el principio:

Transactions Last FY =
VAR _selectedCurrency =
    SELECTEDVALUE ( 'Selected Currency'[Currency Type] )
VAR _selectedPeriod =
    SELECTEDVALUE ( 'Selected Period'[Period Type] )
VAR _filter =
    FILTER (
        ALL (
            'Date Table'[Is Last Year Last Month],
            'Date Table'[Is Last Year Current Month],
            'Date Table'[Is In Last FQTD],
            'Date Table'[Is Complete Fiscal Month of Last FY],
            'Date Table'[Is In Last FYTD]
        ),
        SWITCH (
            _selectedPeriod,
            "Last Month", 'Date Table'[Is Last Year Last Month],
            "Current Month", 'Date Table'[Is Last Year Current Month],
            "Quarter to Date", 'Date Table'[Is In Last FQTD],
            "Last Month Year to Date", 'Date Table'[Is Complete Fiscal Month of Last FY],
            "Year to Date", 'Date Table'[Is In Last FYTD]
        )
    )
RETURN
    CALCULATE (
        SWITCH (
            _selectedCurrency,
            "Group Currency", [Transactions Last FY (Group Currency)],
            "Local Currency", [Transactions Last FY (Local Currency)],
            "Select a single currency type"
        ),
        _filter,
        REMOVEFILTERS ( 'Date Table' )
    )

Opción 2: Utilice SWITCH para elegir entre 5 expresiones diferentes según el tipo de período.

Haciéndolo de esta manera, recomendaría una submedida Transactions Last FY Base:

Transactions Last FY Base =
VAR _selectedCurrency =
    SELECTEDVALUE ( 'Selected Currency'[Currency Type] )
RETURN
    SWITCH (
        _selectedCurrency,
        "Group Currency", [Transactions Last FY (Group Currency)],
        "Local Currency", [Transactions Last FY (Local Currency)],
        "Select a single currency type"
    )

Transactions Last FY =
VAR _selectedPeriod =
    SELECTEDVALUE ( 'Selected Period'[Period Type] )
RETURN
    SWITCH (
        _selectedPeriod,
        "Last Month",
            CALCULATE (
                [Transactions Last FY Base]
                'Date Table'[Is Last Year Last Month],
                REMOVEFILTERS ( 'Date Table' )
            ),
        "Current Month",
            CALCULATE (
                [Transactions Last FY Base],
                'Date Table'[Is Last Year Current Month],
                REMOVEFILTERS ( 'Date Table' )
            ),
        "Quarter to Date",
            CALCULATE (
                [Transactions Last FY Base],
                'Date Table'[Is In Last FQTD],
                REMOVEFILTERS ( 'Date Table' )
            ),
        "Last Month Year to Date",
            CALCULATE (
                [Transactions Last FY Base],
                'Date Table'[Is Complete Fiscal Month of Last FY],
                REMOVEFILTERS ( 'Date Table' )
            ),
        "Year to Date",
                [Transactions Last FY Base],
                'Date Table'[Is In Last FYTD],
                REMOVEFILTERS ( 'Date Table' )
            )
    )

Opción 3: ¿Usar grupos de cálculo?

Puede transferir la lógica de las diversas instrucciones SWITCH a grupos de cálculo, ciertamente para la selección Tipo de período.

Es muy posible que haya malinterpretado algo, ¡así que por favor vuelva a publicar si estos no están dando los resultados esperados!

Saludos

Owen

View solution in original post

6 REPLIES 6
Syndicate_Admin
Administrator
Administrator

¿ @EBGAL

El problema principal aquí es la variable _filter y cómo se usa.

  1. SWITCH (y IF) no pueden devolver valores de tabla, solo valores escalares.
    Dentro de la expresión para _filter, cada una de las posibilidades dentro de la función SWITCH se evalúa en una tabla de una fila/una columna. Da la casualidad de que DAX convierte tablas 1x1 en escalares en los casos en que se espera un escalar. Dado que SWITCH solo puede devolver un escalar, el resultado es un valor escalar TRUE o FALSE. Si alguna de estas tablas tenía más de una fila o columna, se devolvería un error.
  2. Dado que _filter es un valor escalar igual a TRUE o FALSE, no se puede utilizar como argumento de filtro de CALCULATE. Si una expresión booleana se proporciona como argumento de filtro, debe contener una referencia de columna, de lo contrario no se puede interpretar como un filtro. Esto causa el error que mencionó.

¿Cómo solucionar esto?

Primero, como recomendación general, es posible que desee crear submedidas, para preservar su cordura. 🙂

De todos modos, aquí hay algunas ideas:

Opción 1: Crear una tabla de filtros condicionales con FILTER en su lugar

Dentro de la variable _filter, cree una unión cruzada de todas las combinaciones de las 5 columnas booleanas 'Tabla de fechas' y, a continuación, filtre esta tabla en función de _selectedPeriod. Además, debe agregar REMOVEFILTERS ( 'Tabla de fechas') como un argumento dentro de CALCULATE.

Además, para una expresión booleana, = TRUE () es equivalente a .

Entonces, en lugar de escribir 'Tabla de fechas'[Es el último año el mes pasado] = VERDADERO (), puede escribir 'Tabla de fechas'[Es el último año del mes pasado].

No me molesté en crear ninguna submedida aquí, pero esto ilustra el principio:

Transactions Last FY =
VAR _selectedCurrency =
    SELECTEDVALUE ( 'Selected Currency'[Currency Type] )
VAR _selectedPeriod =
    SELECTEDVALUE ( 'Selected Period'[Period Type] )
VAR _filter =
    FILTER (
        ALL (
            'Date Table'[Is Last Year Last Month],
            'Date Table'[Is Last Year Current Month],
            'Date Table'[Is In Last FQTD],
            'Date Table'[Is Complete Fiscal Month of Last FY],
            'Date Table'[Is In Last FYTD]
        ),
        SWITCH (
            _selectedPeriod,
            "Last Month", 'Date Table'[Is Last Year Last Month],
            "Current Month", 'Date Table'[Is Last Year Current Month],
            "Quarter to Date", 'Date Table'[Is In Last FQTD],
            "Last Month Year to Date", 'Date Table'[Is Complete Fiscal Month of Last FY],
            "Year to Date", 'Date Table'[Is In Last FYTD]
        )
    )
RETURN
    CALCULATE (
        SWITCH (
            _selectedCurrency,
            "Group Currency", [Transactions Last FY (Group Currency)],
            "Local Currency", [Transactions Last FY (Local Currency)],
            "Select a single currency type"
        ),
        _filter,
        REMOVEFILTERS ( 'Date Table' )
    )

Opción 2: Utilice SWITCH para elegir entre 5 expresiones diferentes según el tipo de período.

Haciéndolo de esta manera, recomendaría una submedida Transactions Last FY Base:

Transactions Last FY Base =
VAR _selectedCurrency =
    SELECTEDVALUE ( 'Selected Currency'[Currency Type] )
RETURN
    SWITCH (
        _selectedCurrency,
        "Group Currency", [Transactions Last FY (Group Currency)],
        "Local Currency", [Transactions Last FY (Local Currency)],
        "Select a single currency type"
    )

Transactions Last FY =
VAR _selectedPeriod =
    SELECTEDVALUE ( 'Selected Period'[Period Type] )
RETURN
    SWITCH (
        _selectedPeriod,
        "Last Month",
            CALCULATE (
                [Transactions Last FY Base]
                'Date Table'[Is Last Year Last Month],
                REMOVEFILTERS ( 'Date Table' )
            ),
        "Current Month",
            CALCULATE (
                [Transactions Last FY Base],
                'Date Table'[Is Last Year Current Month],
                REMOVEFILTERS ( 'Date Table' )
            ),
        "Quarter to Date",
            CALCULATE (
                [Transactions Last FY Base],
                'Date Table'[Is In Last FQTD],
                REMOVEFILTERS ( 'Date Table' )
            ),
        "Last Month Year to Date",
            CALCULATE (
                [Transactions Last FY Base],
                'Date Table'[Is Complete Fiscal Month of Last FY],
                REMOVEFILTERS ( 'Date Table' )
            ),
        "Year to Date",
                [Transactions Last FY Base],
                'Date Table'[Is In Last FYTD],
                REMOVEFILTERS ( 'Date Table' )
            )
    )

Opción 3: ¿Usar grupos de cálculo?

Puede transferir la lógica de las diversas instrucciones SWITCH a grupos de cálculo, ciertamente para la selección Tipo de período.

Es muy posible que haya malinterpretado algo, ¡así que por favor vuelva a publicar si estos no están dando los resultados esperados!

Saludos

Owen

Hola Owen,

Estoy teniendo un problema similar. Permítanme narrar lo mismo.

datos: https://www.icmagroup.org/membership/List-of-principal-delegates-2/


En Power Query (Get & Transform) producirá 4 columnas basadas en texto, a saber: Empresa, Nombre, Apellido, Jurisdicción del miembro. Creé una nueva columna con el nombre "Nombre completo" concatenando Nombre y Apellido y eliminando Nombre y Apellido del conjunto de datos. Hay un total de 634 registros (el recuento de registros puede variar ya que es una URL en vivo)

Mi objetivo:

Filtrar el nombre de la empresa por Jurisdicción miembro mediante la condición de filtrado de la columna Empresa. He aquí un ejemplo:

Total Count of Member Banks of Type LLP = 
CALCULATE( 
     COUNT( ICMA_Members[Company] ),
     FILTER( ICMA_Members, CONTAINSSTRING( ICMA_Members[Company], TRIM("LLP") ) )
)

Ahora hay otras condiciones de filtrado como LLC, PLC, Limited, Ltd, B.V. y para cada una de ellas si creo una Medida, entonces sería una gran lista del mismo tipo de medidas. Así que pensé en recopilar toda esta actividad de filtrado en una sola medida DAX como la siguiente:

Total Count of Member Banks of Each Type = 

VAR Filter_TypeAG = 
FILTER( ICMA_Members, 
            (
                CONTAINSSTRING( ICMA_Members[Company], " AG "  ) ||
                CONTAINSSTRING( ICMA_Members[Company], " AG"  )
            )
)

VAR Filter_TypeBV = 
FILTER( ICMA_Members, CONTAINSSTRING( ICMA_Members[Company], TRIM("B.V.") ) )

VAR Filter_TypeGmbH = 
FILTER( ICMA_Members, CONTAINSSTRING( ICMA_Members[Company], TRIM( "GmbH" ) ) )

VAR Filter_TypeLimited = 
FILTER( ICMA_Members, 
        (
            CONTAINSSTRING( ICMA_Members[Company], TRIM("Limited") ) || 
            CONTAINSSTRING( ICMA_Members[Company], TRIM("Ltd") ) 
        )
)

VAR Filter_TypeLLC = 
FILTER( ICMA_Members, CONTAINSSTRING( ICMA_Members[Company], TRIM("LLC") ) )

VAR Filter_TypeLLP = 
FILTER( ICMA_Members, CONTAINSSTRING( ICMA_Members[Company], TRIM("LLP") ) )

VAR Filter_TypembB = 
FILTER( ICMA_Members, CONTAINSSTRING( ICMA_Members[Company], TRIM("mbB") ) )

VAR Filter_TypeNV = 
FILTER( ICMA_Members, CONTAINSSTRING( ICMA_Members[Company], TRIM("N.V.") ) )

VAR Filter_TypePLC = 
FILTER( ICMA_Members, 
            ( 
              CONTAINSSTRING( ICMA_Members[Company], "PLC" ) || 
              CONTAINSSTRING( ICMA_Members[Company], "p.l.c" )
            ) 
        )

VAR Filter_TypeSA = 
FILTER( ICMA_Members,
            (
                CONTAINSSTRING( ICMA_Members[Company], TRIM("S.A.") ) ||
                CONTAINSSTRING( ICMA_Members[Company], " SA " ) ||
                CONTAINSSTRING( ICMA_Members[Company], " SA" )
            )
     )

VAR Filter_TypeSpA = 
FILTER( ICMA_Members, 
            (
                CONTAINSSTRING( ICMA_Members[Company], " S.p.A." ) || 
                CONTAINSSTRING( ICMA_Members[Company], " SpA" ) ||
                CONTAINSSTRING( ICMA_Members[Company], " S.P.A." )
            ) 
        )        

VAR Filter_TypeSE = 
FILTER( ICMA_Members, CONTAINSSTRING( ICMA_Members[Company], " SE " ) )

VAR Filter_TypeOthers = 
FILTER( ICMA_Members,
           NOT( 
               (
                   CONTAINSSTRING( ICMA_Members[Company], TRIM( "Limited" ) ) || 
                   CONTAINSSTRING( ICMA_Members[Company], TRIM( "Ltd" ) ) || 
                   CONTAINSSTRING( ICMA_Members[Company], TRIM( "LLP" ) ) ||
                   CONTAINSSTRING( ICMA_Members[Company], "PLC" ) ||
                   CONTAINSSTRING( ICMA_Members[Company], "p.l.c" ) ||
                   CONTAINSSTRING( ICMA_Members[Company], TRIM( "B.V." ) ) ||
                   CONTAINSSTRING( ICMA_Members[Company], TRIM( "N.V." ) ) ||
                   CONTAINSSTRING( ICMA_Members[Company], TRIM( "S.A." ) ) ||
                   CONTAINSSTRING( ICMA_Members[Company], TRIM( " SA " ) ) ||
                   CONTAINSSTRING( ICMA_Members[Company], " S.p.A." ) ||
                   CONTAINSSTRING( ICMA_Members[Company], " SpA" ) ||
                   CONTAINSSTRING( ICMA_Members[Company], " S.P.A" ) ||
                   CONTAINSSTRING( ICMA_Members[Company], TRIM( "AG" ) ) ||
                   CONTAINSSTRING( ICMA_Members[Company], TRIM( "GmbH" ) ) ||
                   CONTAINSSTRING( ICMA_Members[Company], TRIM( "mbB" ) ) ||
                   CONTAINSSTRING( ICMA_Members[Company], " SE  " )
                )
            ) 
)    

RETURN
CALCULATETABLE( 
    VALUES( 
        SWITCH( 
            TRUE(),
            Filter_TypeAG, CALCULATE( COUNT( ICMA_Members[Company] ), Filter_TypeAG ),
            Filter_TypeBV, CALCULATE( COUNT( ICMA_Members[Company] ), Filter_TypeBV ),
            Filter_TypeGmbH, CALCULATE( COUNT( ICMA_Members[Company] ), Filter_TypeGmbH ),
            Filter_TypeLimited, CALCULATE( COUNT( ICMA_Members[Company] ), Filter_TypeLimited ),
            Filter_TypeLLC, CALCULATE( COUNT( ICMA_Members[Company] ), Filter_TypeLLC ),
            Filter_TypeLLP, CALCULATE( COUNT( ICMA_Members[Company] ), Filter_TypeLLP ),
            Filter_TypembB, CALCULATE( COUNT( ICMA_Members[Company] ), Filter_TypembB ),
            Filter_TypeNV, CALCULATE( COUNT( ICMA_Members[Company] ), Filter_TypeNV ),
            Filter_TypePLC, CALCULATE( COUNT( ICMA_Members[Company] ), Filter_TypePLC ),
            Filter_TypeSA, CALCULATE( COUNT( ICMA_Members[Company] ), Filter_TypeSA ),
            Filter_TypeSE, CALCULATE( COUNT( ICMA_Members[Company] ), Filter_TypeSE ),
            Filter_TypeSpA, CALCULATE( COUNT( ICMA_Members[Company] ), Filter_TypeSpA ),
            Filter_TypeOthers, CALCULATE( COUNT( ICMA_Members[Company] ), Filter_TypeOthers )
        )
    )
 )

El mensaje de error correspondiente que veo en la parte inferior se pega como una captura de pantalla:

rivthebest_0-1663995329372.png

Por favor, avíseme cuál de las opciones mencionadas por usted en el paso anterior sería aplicable para mi caso o lo tengo planeado de una manera diferente.

La parte 2 del problema es colocar la salida de cada uno de estos recuentos para colocarla en una tarjeta visual separada o en una tarjeta visual de fila múltiple donde Jurisdicción miembro como filtro de informe. La captura de pantalla del visual planificado se adjunta a continuación:

rivthebest_1-1663995623077.png

Por favor, ayúdame.

Saludos Riv

@rivthebest

Simplemente leyendo sus requisitos, sugeriría un enfoque diferente.

Dado que desea clasificar cada empresa como AG, BV, etc., le sugiero que agregue una columna de texto a su tabla para almacenar estos valores, llamada "Tipo" o similar. Esto le dará un mejor rendimiento que calcularlos sobre la marcha en medida (s), y debería ser más fácil crear las imágenes que desea.

Recomendaría agregar esta columna Tipo en Power Query, pero también podría crear una columna calculada de DAX (usando código similar al que ya ha escrito).

Por favor, vuelva a publicar si es necesario, y un PBIX que funcione ayudaría (si puede compartirlo).

Saludos

Owen

Gracias Owen,

Déjame probar los pasos que mencionaste y publicaré mi progreso sobre eso con seguridad.

Saludos Riv

@OwenAuger ,

Ahora quiero mejorar esta lógica y dar al consumidor la opción de elegir los años fiscales para comparar.

He implementado previamente su sugerencia 1, ¿cómo puedo agregar un año dinámico en la lógica?

Gracias

Evan

@OwenAuger ,

Gracias por su respuesta.

Sus explnaciones son muy útiles.

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.