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

Earn the coveted Fabric Analytics Engineer certification. 100% off your exam for a limited time only!

Reply
Anonymous
Not applicable

Relacionar una columna con dos columnas en otra tabla mientras se utilizan ambas relaciones en una medida

¡Saludos!

Cualquier ayuda es muy apreciada! 😀

Yo. Los datos

Tengo dostablas: una contiene información de cuenta (considere tres columnas 'ID', 'Product_Type' y 'Employee_Number'), y la otra contiene datos transaccionales (considere dos columnas 'ID' y 'Total_Tran_Count'). Llamemos a la primera la tabla ACCT y a la segunda la tabla TRAN. Inicialmente, relaté los dos por la columna 'ID' común en ambos (activo), y esto funcionó bien. Sin embargo, me di cuenta de que para 'Product_Type' - "Emp Card", en TRAN, el número de empleado se utiliza a veces en lugar de la identificación real.

ACCT TRAN

ID 1:* ID

Por lo tanto, cuando creé la siguiente medida(también relacionados activamente TRAN con una tabla de calendario, pero incluí USERELATIONSHIP sólo para ser seguro),

01 Transaction Count = 
CALCULATE(SUM(TRAN[Total_Tran_Count]), 
USERELATIONSHIP('CALENDAR: Transactions'[DateKey], TRAN[Trandate_DateKey]))

... y lo usé en un gráfico de columnas en el que valores 01 recuento de transacciones y leyenda - ACCT[Product_Type], estaba obteniendo un número menor para 'Product_Type' - "Tarjeta emp" ya que hay filas que están activamente relacionadas con ACCT[ID] pero que deben estar relacionadas con ACCT[Employee_Number]. Consulte a continuación tablas de muestra simplificadas.

Datos de muestra para ACCT Datos de muestra para TRAN
IdProduct_TypeEmployee_Number IdTotal_Tran_Count
1Tarjeta ANull 150
2Tarjeta BNull 2100
3Tarjeta Emp000001 00000125

II. Pasos de acción

1. Lo primero que hice fue crear una relación inactiva entre ACCT[Employee_Number] y TRAN[ID], y...

2. Ajusté la medida a lo siguiente:

01 Transaction Count v2 = 
CALCULATE(SUM(TRAN[Total_Tran_Count]), 
USERELATIONSHIP('CALENDAR: Transactions'[DateKey], TRAN[Trandate_DateKey]),
USERELATIONSHIP(ACCT[Employee_Number], TRAN[ID]))

... pero como se menciona en este enlace,este valor predeterminado es AND lógico, y por lo tanto rompe mis objetos visuales cada vez que uso una segmentación con 'Product_Type' y/o 'Product_Type' se establece en una leyenda, excepto cuando 'Product_Type' - "Tarjeta Emp".

3. A continuación, lo ajusté de nuevo a lo siguiente:

01 Transaction Count v3 = 
CALCULATE(SUM(TRAN[Total_Tran_count]), 
USERELATIONSHIP('CALENDAR: Transactions'[DateKey], TRAN[Trandate_DateKey]),
KEEPFILTERS(ACCT[Product_Type] <> "Emp Card"))
+
CALCULATE(SUM(TRAN[Total_Tran_count]), 
USERELATIONSHIP('CALENDAR: Transactions'[DateKey], TRAN[Trandate_DateKey]),
USERELATIONSHIP(ACCT[Employee_Number], TRAN[ID]),
KEEPFILTERS(ACCT[Product_Type] = "Emp Card"))

... y esto es lo más cerca que pude conseguir en obtener el SUM completo(TRAN[Total_Tran_count]) para 'Product_Type' - "Tarjeta Emp" Y poder cortar por producto PERO todavía no es perfecto, ya que ahora estoy recibiendo un total general más pequeño ya que las tarjetas Emp que se incluyeron originalmente en la primera versión de 01 Transaction Count ahora estaban siendo excluidas en el primer CALCULATE en 01 Transaction v3. Sin mencionar, no creo que sea un ajuste muy robusto.

III. Próximos pasos

¿Hay alguna manera de lograr lo que necesito sin crear una nueva columna en TRAN que busca un valor en ACCT[Employee_Number] y devuelve el ACCT[ID] correspondiente? También estoy abierto a tener tablas de referencia si eso ayuda ya que puedo tener otras tablas transacctionales que tienen un problema similar con las tarjetas Emp.

Lo siento por el largo post, y muchas gracias!

1 ACCEPTED SOLUTION
Anonymous
Not applicable

¡Hola!

Traté de aplicar la medida que obtuve la semana pasada a mi archivo PBIX real y el modelo de datos para probarlo ya que hay una gran cantidad de dimensiones disponibles para los usuarios finales para filtrar el recuento total de transacciones por. Tomó más tiempo de lo que esperaba, ya que encontré algunos casos extremos que necesitaban estar dentro del alcance de la medida.

Otros problemas que encontré fueron cálculos incorrectos al agregar por columnas en otras tablas conectadas, o por otras columnas en TRAN. Esto se ilustró en un gráfico combinado de barras apiladas + líneas en el que—utilizando la medida en "Valores de columna" y "Valores de línea"—la serie de columnas que también procedía de TRAN (por ejemplo. TRAN[Transaction_Type]) no pudo agregarse correctamente, pero el gráfico de líneas sí, lo que significaba que la medida tenía problemas cuando estaba agregando por cualquier cosa que no fuera ACCT[Product_Type] y CALENDAR[Fecha] con digamos, una tabla para el primero y un gráfico de líneas para el segundo.

En cualquier caso, la medida que usaré por ahora es la siguiente:

FINAL Transaction Count = 
VAR first_nonblank = CALCULATE(FIRSTNONBLANK(ACCT[Employee_Number], 1), FILTER(ALLSELECTED(ACCT), ACCT[Employee_Number] <> ""))
VAR edge_case = CALCULATE(IF(HASONEVALUE(ACCT[Employee_Number]), TRUE(), FALSE()), ALLSELECTED(ACCT[Employee_Number]))
RETURN
IF (
    ISBLANK(first_nonblank) && NOT(edge_case),

    -- 1. Result if True
    IF (
        SELECTEDVALUE(ACCT[Employee_Number]) = "" && NOT(edge_case),

        -- 1.1.
        CALCULATE (
          SUM(TRAN[Total_Tran_Count]),
          USERELATIONSHIP(CALENDAR[DateKey], TRAN[TranDate_DateKey]),
          USERELATIONSHIP(ACCT[Employee_Number], TRAN[ID])
        ),

        -- 1.2.
        SUM(TRAN[Total_Tran_Count])
        +   CALCULATE (
              SUM(TRAN[Total_Tran_Count]),
              USERELATIONSHIP(CALENDAR[DateKey], TRAN[TranDate_DateKey]),
              USERELATIONSHIP(ACCT[Employee_Number], TRAN[ID])
            )
    ), 

    -- 2. Result if False
    IF (
        ISCROSSFILTERED(ACCT),
       
        -- 2.1. Result if True
        IF (
            OR(
                SELECTEDVALUE(ACCT[PRODUCT]) = "Emp Card",
                AND("Emp Card" IN VALUES(ACCT[Product_Type]), ISFILTERED(ACCT[Product_Type]))
            ),

            -- 2.1.1.
            SUM(TRAN[Total_Tran_Count]) 
            +   CALCULATE (
                 SUM(TRAN[Total_Tran_Count]),
                 USERELATIONSHIP(CALENDAR[DateKey], TRAN[TranDate_DateKey]),
                 USERELATIONSHIP(ACCT[Employee_Number], TRAN[ID])
                ),

            -- 2.1.2.                   
            SUM(TRAN[Total_Tran_Count])
        ),
           
        -- 2.2. Result if False
        SUM(TRAN[Total_Tran_Count])
    )
)

En general, la medida necesaria es realmente inferior a "2. Resultado si es False", pero las líneas anteriores son para los casos de borde y agregando por otras columnas. Creo que debe haber un método más simple para lo que estoy tratando de lograr, pero se me escapa por ahora. También terminé confiando en el valor de ACCT[Product_Type].

Espero que esto sea útil para otros, y si hay alguien que tiene otra solución, por favor no dude en enviarme un mensaje! 😀

View solution in original post

6 REPLIES 6
MFelix
Super User
Super User

Hola @dasbrillantes ,

No estoy muy seguro de si esto es lo que necesita, ya que el número de líneas en el ejemplo es muy pequeño, pero intente usar la siguiente sintaxis con tablas desconectadas:

Measure =
CALCULATE (
    SUM ( 'TRAN'[Total_Tran_count] );
    FILTER (
        'TRAN';
        'TRAN'[ID] = SELECTEDVALUE ( ACCT[ID] )
            || 'TRAN'[ID] = SELECTEDVALUE ( ACCT[Employee_Number] )
    )
)

Tenga en cuenta que en los datos de ejemplo no tiene un ejemplo con valores en columnas bopth o valores duplicados, por lo que esto puede necesitar algunos cambios si hay algunas columnas con número DE Y employye o obtendrá la suma de todos los valores.


Regards

Miguel Félix


Did I answer your question? Mark my post as a solution!

Proud to be a Super User!

Check out my blog: Power BI em Português



Anonymous
Not applicable

Hola, @MFelix !

Gracias por su respuesta! Desafortunadamente, la medida sugerida no resolvió el problema y dio lugar a imágenes que mostraban 'BLANK'. Tampoco creo que pueda hacer mesas desconectadas.

Disculpas por las tablas de muestras demasiado simplificadas. Por favor, vea uno más informativo a continuación (las filas resaltadas son filas de la tarjeta Emp):

dasbrillantes_0-1599577503732.png

Como puede ver, la medida actual no puede incluir las dos filas en TRAN porque hacen uso del número de empleado en lugar del identificador real. Por favor, hágamelo saber si necesito cambiar la dirección de filtrado cruzado, etc.

¡Gracias!

Hola @dasbrillantes ,

Creo que la mejor solución es rellenar los espacios en blanco en el ID de empleado en la tabla ACCT con el IDENTIFICADOR y luego hacer la relación con esa columna.

Sin embargo, puede probar el siguiente código:

Measure =
IF (
    ISINSCOPE ( ACCT[Product_Type] );
    IF (
        SELECTEDVALUE ( ACCT[Product_Type] ) = BLANK ();
        BLANK ();
        SWITCH (
            SELECTEDVALUE ( ACCT[Product_Type] );
            "Emp Card";
                SUM ( 'TRAN'[Total_Tran_Count] )
                    + CALCULATE (
                        SUM ( 'TRAN'[Total_Tran_Count] );
                        FILTER ( ALLSELECTED ( ACCT[Product_Type] ); ACCT[Product_Type] = BLANK () )
                    );
            SUM ( 'TRAN'[Total_Tran_Count] )
        )
    );
    SUM ( 'TRAN'[Total_Tran_Count] )
)

En esta medida asumo que usted tiene la tarjeta emp cada vez que no hay identificación en la tabla relacionada.

Compruebe la conexión PBIX.


Regards

Miguel Félix


Did I answer your question? Mark my post as a solution!

Proud to be a Super User!

Check out my blog: Power BI em Português



Anonymous
Not applicable

Hola @MFelix! Disculpas por volverte tarde.


@MFelix escribió:

Creo que la mejor solución es rellenar los espacios en blanco en el ID de empleado en la tabla ACCT con el IDENTIFICADOR y luego hacer la relación con esa columna.


Desafortunadamente, eso no funcionará tan bien ya que hay filas en TRAN que realmente usan el ACCT[ID] y no el número de empleado para las tarjetas Emp. Véase ACCT[ID] 5 en las tablas de ejemplo de mi respuesta anterior.

¡Gracias por la medida! Desafortunadamente se comportó de manera similar a la medida original y no pudo incorporar las filas DE TRAN con el número de empleado (por ejemplo, el resultado es el mismo que la tabla de mi respuesta anterior donde faltaba 3000) cuando lo usé en mi archivo PBIX real. Creo que es debido a la dirección de crossfiltering entre ACCT y TRAN. El archivo que me dio tenía una sola dirección entre estas dos tablas, mientras que mi dirección de tabla real está en "Ambos" (consulte las tablas de muestra en mi respuesta anterior).

Sin embargo, me señaló una nueva forma de pensar y me llevó a esta medida que hasta ahora ha sido correcta:

IF (
    ISCROSSFILTERED(ACCT[Employee_Number]),
   
        SUM(TRAN[Total_Tran_Count])
        + CALCULATE (
            SUM(TRAN[Total_Tran_Count]),
            USERELATIONSHIP(CALENDAR[DateKey], TRAN[TranDate_DateKey]),
            USERELATIONSHIP(ACCT[Employee_Number], TRAN[ID])

    ),
    CALCULATE(SUM(TRAN[Total_Tran_Count]))
)

Esto me ha dado hasta ahora el número correcto para los totales de TRAN[Product_Type] y el total de la columna, Y ha mantenido esos filtros incluso cuando corte por TRAN[Product_Type]. Tampoco quería depender de los valores exactos de TRAN[Product_Type] ya que puede cambiar en el futuro.

Por favor, hágamelo saber si esto se puede mejorar y / o si puede haber problemas con esta medida.

¡Gracias!

Hola @dasbrillantes ,

En cuanto a la relación que presentas no estaba abble para replicarlos en mi modelo porque tengo una relación de muchos a muchos cuando te refieres que es uno a muchos.

La sugerencia que estaba dando fue con el fin de crear una sola columna id, en mi opinión las relaciones de crossfilter pueden dar dolores de cabeza en el futuro, especialmente si necesita hacer otros cálculos y puede tener que crear filtros adicionales o medir porque el filtro son para ambos lados de la tabla.

La medida me parece bien y no parece tener ningún problema importante, pero tenga cuidado porque dependiendo del tamaño de su modelo y más información puede tener problemas de rendimiento o la necesidad de configurar medidas adicionales para los cálculos que sería simple.

Por favor, no se olvide de marcar su respuesta como correcta para que pueda ayudar a otros.


Regards

Miguel Félix


Did I answer your question? Mark my post as a solution!

Proud to be a Super User!

Check out my blog: Power BI em Português



Anonymous
Not applicable

¡Hola!

Traté de aplicar la medida que obtuve la semana pasada a mi archivo PBIX real y el modelo de datos para probarlo ya que hay una gran cantidad de dimensiones disponibles para los usuarios finales para filtrar el recuento total de transacciones por. Tomó más tiempo de lo que esperaba, ya que encontré algunos casos extremos que necesitaban estar dentro del alcance de la medida.

Otros problemas que encontré fueron cálculos incorrectos al agregar por columnas en otras tablas conectadas, o por otras columnas en TRAN. Esto se ilustró en un gráfico combinado de barras apiladas + líneas en el que—utilizando la medida en "Valores de columna" y "Valores de línea"—la serie de columnas que también procedía de TRAN (por ejemplo. TRAN[Transaction_Type]) no pudo agregarse correctamente, pero el gráfico de líneas sí, lo que significaba que la medida tenía problemas cuando estaba agregando por cualquier cosa que no fuera ACCT[Product_Type] y CALENDAR[Fecha] con digamos, una tabla para el primero y un gráfico de líneas para el segundo.

En cualquier caso, la medida que usaré por ahora es la siguiente:

FINAL Transaction Count = 
VAR first_nonblank = CALCULATE(FIRSTNONBLANK(ACCT[Employee_Number], 1), FILTER(ALLSELECTED(ACCT), ACCT[Employee_Number] <> ""))
VAR edge_case = CALCULATE(IF(HASONEVALUE(ACCT[Employee_Number]), TRUE(), FALSE()), ALLSELECTED(ACCT[Employee_Number]))
RETURN
IF (
    ISBLANK(first_nonblank) && NOT(edge_case),

    -- 1. Result if True
    IF (
        SELECTEDVALUE(ACCT[Employee_Number]) = "" && NOT(edge_case),

        -- 1.1.
        CALCULATE (
          SUM(TRAN[Total_Tran_Count]),
          USERELATIONSHIP(CALENDAR[DateKey], TRAN[TranDate_DateKey]),
          USERELATIONSHIP(ACCT[Employee_Number], TRAN[ID])
        ),

        -- 1.2.
        SUM(TRAN[Total_Tran_Count])
        +   CALCULATE (
              SUM(TRAN[Total_Tran_Count]),
              USERELATIONSHIP(CALENDAR[DateKey], TRAN[TranDate_DateKey]),
              USERELATIONSHIP(ACCT[Employee_Number], TRAN[ID])
            )
    ), 

    -- 2. Result if False
    IF (
        ISCROSSFILTERED(ACCT),
       
        -- 2.1. Result if True
        IF (
            OR(
                SELECTEDVALUE(ACCT[PRODUCT]) = "Emp Card",
                AND("Emp Card" IN VALUES(ACCT[Product_Type]), ISFILTERED(ACCT[Product_Type]))
            ),

            -- 2.1.1.
            SUM(TRAN[Total_Tran_Count]) 
            +   CALCULATE (
                 SUM(TRAN[Total_Tran_Count]),
                 USERELATIONSHIP(CALENDAR[DateKey], TRAN[TranDate_DateKey]),
                 USERELATIONSHIP(ACCT[Employee_Number], TRAN[ID])
                ),

            -- 2.1.2.                   
            SUM(TRAN[Total_Tran_Count])
        ),
           
        -- 2.2. Result if False
        SUM(TRAN[Total_Tran_Count])
    )
)

En general, la medida necesaria es realmente inferior a "2. Resultado si es False", pero las líneas anteriores son para los casos de borde y agregando por otras columnas. Creo que debe haber un método más simple para lo que estoy tratando de lograr, pero se me escapa por ahora. También terminé confiando en el valor de ACCT[Product_Type].

Espero que esto sea útil para otros, y si hay alguien que tiene otra solución, por favor no dude en enviarme un mensaje! 😀

Helpful resources

Announcements
April AMA free

Microsoft Fabric AMA Livestream

Join us Tuesday, April 09, 9:00 – 10:00 AM PST for a live, expert-led Q&A session on all things Microsoft Fabric!

March Fabric Community Update

Fabric Community Update - March 2024

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

Top Solution Authors