Consulta Excel DAX con tabla puente usando CROSSFILTER

Un usuario Pregunto ✅

JFGrenier

Hola, esta es mi segunda opinión sobre un problema que tengo usando la sintaxis correcta en una consulta DAX de Excel:

RelacionesRelaciones

MesasMesas

Hice una medida de trabajo en powerpivot usando una tabla dinámica con filtros:

CountryGrp:=CALCULATE(SUM(DataTable[Value]);CROSSFILTER(DataTable[IdCountry];Country[IdCountry];Both);CROSSFILTER(Country[IdCountry];CountryGroup[IdCountry];Both))

¿Puedo duplicar este comportamiento con una consulta DAX?

Necesito SUMAR los valores donde IdCountryGroup = 1 y Years = 2019

El resultado sería:

2019 Norteamérica 15000

Aquí es donde estoy sin éxito:

EVALUATE
ADDCOLUMNS (
    SUMMARIZE ( DataTable, DataTable[Year] ),
    "Val",
        CALCULATE (
            SUM ( DataTable[Value] ),
            CROSSFILTER ( DataTable[IdCountry], Country[IdCountry], BOTH ),
            CROSSFILTER ( Country[IdCountry], CountryGroup[IdCountry], BOTH ),
            FILTER ( CountryGroup, CountryGroup[IdCountryGroup] = 1 )
        )
)

¿Y cómo puedo poner un filtro en 2 tablas diferentes?
¡Gracias por tu ayuda!

antrikshsharma

En respuesta a JFGrenier

@JFGrenier Claro, esa es la mejor decisión, puede escribir un DAX complejo que podría fallar mañana si no se escribe teniendo en cuenta todos los detalles posibles, ¡pero un modelo de datos que sea perfecto siempre le brindará la solución requerida con un DAX mínimo!

CNENFRNL

Es raro que mi respuesta anterior desapareciera sin dejar rastro…🤔

@JFGrenier en mi humilde opinión, para propagar el filtro de múltiples lado a uno (1) lado de una relación, tabla ampliada

sería una opción preferible.

En cuanto a su problema, filtros en CountryGroup

CALCULATETABLE ( VALUES ( Country[IdCountry] ), CountryGroup )

puede surtir efecto en Country(1) de esta manera,

entonces dicho filtrado se propaga naturalmente desde Country(1) a DataTable

Total Values :=
CALCULATE (
    SUM ( DataTable[Value] ),
    CALCULATETABLE ( VALUES ( Country[IdCountry] ), CountryGroup )
)

después.

Por favor, intente medir

antrikshsharma1 PNG

1 PNG

2 PNG 2 PNG

JFGrenier

¡Y gracias por tu respuesta!

Hay una razón específica para la tabla CountryGroup. Perdón por no mencionarlo antes. Es porque un país puede estar en un grupo de varios países. Por ejemplo: Egipto puede estar en el grupo de países África y también en el grupo de países África del Norte. Lo que propones crearía una relación de muchos a muchos. ¡Gracias de nuevo!

antrikshsharma

En respuesta a

JFGrenier @JFGrenier Aún así, ¿debe concentrarse en cambiar el modelo, crear 2 filas para Egipto en ese caso, con una clave única para ambos?

JFGrenier

En respuesta a

antrikshsharma

Digamos que Egipto está en 3 CountryGroup, la cosa es que tendría que copiar los datos asociados a Egipto 2 veces más con una identificación diferente. Ya tengo 14 millones de filas en DataTable y, para un sistema de 32 bits, creo que está cerca del máximo. Pero, ¿qué pasa si agrego varias columnas de ID en mi tabla CountryGroup? Comprobaré cuántos países pueden estar en varios CountryGroup. Si hay 15 países, simplemente agregaría 15 columnas de ID y cambiaría la relación en consecuencia. ¿Crees que la función DAX RELACIONADA podría funcionar? ¿O conoces alguna otra función que pueda cambiar las relaciones? Mis consultas DAX se crean en tiempo de ejecución a través de un formulario de usuario de Excel y sería fácil detectar estas excepciones. ¡Me señalas en una nueva dirección! ¡Cambiar el modelo puede ser mi única solución![Year][HS2]Pero antes de eso, daré una oportunidad más a esta consulta:

¿Dónde (sintaxis) podría agregar un filtro a DataTable?

EVALUATE
ADDCOLUMNS (
    SUMMARIZE ( DataTable, DataTable[Year] ),
    "Val",
        CALCULATE (
            SUM ( DataTable[Value] ),
            CROSSFILTER ( DataTable[IdCountry], Country[IdCountry], BOTH ),
            CROSSFILTER ( Country[IdCountry], CountryGroup[IdCountry], BOTH ),
            FILTER ( CountryGroup, CountryGroup[IdCountryGroup] = 1 )
        )
)

=2019 && tabla de datos

= 10 en la consulta a continuación?

En la función Resumir, en Calcular o si no???

¡Gracias de nuevo!

antrikshsharma

Table =
ADDCOLUMNS (
    CALCULATETABLE ( SUMMARIZE ( Data, Data[Year] ), Data[Year] = 2019 ),
    "Val",
        CALCULATE (
            [Total Value],
            CROSSFILTER ( Data[IdCountry], Country[IdCountry], BOTH ),
            CountryGroup[IdCountryGroup] = 1
        ),
    "CountryName",
        CALCULATE (
            DISTINCT ( CountryGroup[CountryGroupName] ),
            CROSSFILTER ( Data[IdCountry], Country[IdCountry], BOTH ),
            CountryGroup[IdCountryGroup] = 1
        )
)

En respuesta a@JFGrenier Intente esto: para el nombre del país en caso de que haya más de 1 valor, puede usar CONCATENATEX (construcción CALCULATETABLE. El archivo está debajo de mi firma:

1 PNG 1 PNG

JFGrenier

En respuesta a

antrikshsharma

Hola Antrish,

Probé su última solución DAX en mi ‘Modelo de datos’ real (lo que mostré es una versión reducida y traducida).

¡Tuve que adaptarlo un poco para el estudio DAX en francés y verifiqué varias veces para que coincidiera con su código!

El filtro en IdCountryGroup no parece tener ningún efecto… El nombre del grupo de países cambia en consecuencia, pero los valores devueltos son siempre los mismos. Es la suma de todos los valores de la tabla de datos para el año filtrado. Supongo que tendré que cambiar mi modelo de datos.

¡Gracias por su tiempo y conocimiento!

antrikshsharma

En respuesta a

JFGrenier @JFGrenier Claro, esa es la mejor decisión, puede escribir un DAX complejo que podría fallar mañana si no se escribe teniendo en cuenta todos los detalles posibles, ¡pero un modelo de datos que sea perfecto siempre le brindará la solución requerida con un DAX mínimo!

CNENFRNL

En respuesta a JFGrenier Personalmente, evito aprovechar CROSSFILTER tanto como sea posible, especialmente en un modelo de datos complejo.En cuanto a su modelo, para propagar filtros en PaísGrupo

a

País(1)

CALCULATETABLE ( VALUES ( Country[IdCountry] ), CountryGroup )

,

tabla ampliada es una excelente opción, Además, los filtros en País(1) o

Mes(1)

Total Values =
CALCULATE (
    SUM ( Data[Value] ),
    CALCULATETABLE ( VALUES ( Country[IdCountry] ), CountryGroup )
)

propagarse de forma natural a

Datos

para cualquier cálculo; por lo tanto, escribiría una medida de esta manera,

greg_deckler
@JFGrenier: no estoy muy seguro de entender la situación completa aquí. Si tiene el mismo modelo de datos en ambos lugares, Excel y Power BI, el DAX debería ser el mismo.

Realmente no hay suficiente información para continuar, primero verifique si su problema es un problema común que se enumera aquí: https://community.powerbi.com/t5/Community-Blog/Before-You-Post-Read-This/ba-p /1116882

Además, consulte esta publicación sobre cómo obtener una respuesta rápida a su pregunta: https://community.powerbi.com/t5/Community-Blog/How-to-Get-Your-Question-Answered-Quickly/ba-p/38490

Las partes más importantes son:

1. Muestre datos como texto, use la herramienta de tabla en la barra de edición

2. Salida esperada de datos de muestra

3. Explicación en palabras de cómo pasar del 1 al 2.

amichandak

@JFGrenier, Dax es el mismo en ambos lugares, debería funcionar.

¿Puede compartir datos de muestra y resultados de muestra en formato de tabla? O un pbix de muestra después de eliminar datos confidenciales.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *