Comparar plan y datos reales

Un usuario Pregunto ✅

bluetronics

Hola a todos,

Quiero ver las diferencias entre Plan y Actual. Obtuve las 2 tablas de Excel a continuación. ¿Cómo hago una tabla que me gustaría ver a continuación?

20190117_173653.png

Gracias por adelantado.

Alba

Hola @bluetronics

Aunque creo que sería más conveniente hacer esto en el editor de consultas (M), también puedes intentar crear una nueva tabla calculada con DAX:

TestTable =
VAR _BaseTable =
    DISTINCT (
        UNION (
            SUMMARIZECOLUMNS ( Actual[Customer]; Actual[Product] );
            SUMMARIZECOLUMNS ( Plan[Customer]; Plan[Product] )
        )
    )
RETURN
    ADDCOLUMNS (
        _BaseTable;
        "Difference"; LOOKUPVALUE (
            Actual[Qty];
            Actual[Customer]; [Customer];
            Actual[Product]; [Product]
        )
            - LOOKUPVALUE ( Plan[Qty]; Plan[Customer]; [Customer]; Plan[Product]; [Product] )
    )

Código formateado con www.daxformatter.com

bluetronics

En respuesta a Alba

HOLA @ AIB,

Su instrucción fue excelente para trabajar en general, pero tuve un problema con «Se proporcionó una tabla de valores múltiples donde se esperaba un valor único». cuando aplico a big data. Y lo encontré por qué, pero no sé cómo solucionar el problema. ¿Puedes ayudarme de nuevo?

Puedo ver el mensaje de error cuando hay diferentes valores de búsqueda. ¿Sabe cómo hacerlo si quiero sumar la cantidad para el mismo cliente y producto?

20190119_014109.png

Saludos,

Alba

En respuesta a bluetronics

@bluetronics

NewTable = 
VAR _BaseTable =
    DISTINCT (
        UNION (
            SUMMARIZECOLUMNS ( Actual[Customer]; Actual[Product] );
            SUMMARIZECOLUMNS ( Plan[Customer]; Plan[Product] )
        )
    )
RETURN
    ADDCOLUMNS (
        _BaseTable;
        "Difference"; 
        VAR _CurrentCustomer=[Customer]
        VAR _CurrentProduct=[Product] 
        RETURN 
           CALCULATE(SUM(Actual[Qty]); Actual[Customer]=_CurrentCustomer; Actual[Product]=_CurrentProduct)
           - CALCULATE(SUM(Plan[Qty]); Plan[Customer]=_CurrentCustomer; Plan[Product]=_CurrentProduct)
    )

Alba

En respuesta a Alba

@bluetronics

O, en realidad, podríamos tener otra versión con dos COLUMNAS ADICIONALES anidadas para hacer que el código sea un poco menos detallado y evitar algunos recálculos que supongo que serían más rápidos, aunque no puedo estar seguro al respecto.

NewTableExtended_v2 = 
VAR _BaseTable =
    DISTINCT (
        UNION (
            SUMMARIZECOLUMNS ( Actual[Customer]; Actual[Product] );
            SUMMARIZECOLUMNS ( Plan[Customer]; Plan[Product] )
        )
    )
RETURN
    ADDCOLUMNS (
        ADDCOLUMNS (
            _BaseTable;
            "Plan-Qty";
            VAR _CurrentCustomer = [Customer]
            VAR _CurrentProduct = [Product]
            VAR _CurrentPlan =
                CALCULATE (
                    SUM ( Plan[Qty] );
                    Plan[Customer] = _CurrentCustomer;
                    Plan[Product] = _CurrentProduct
                )
            RETURN
                _CurrentPlan;
            "Actual-Qty";
            VAR _CurrentCustomer = [Customer]
            VAR _CurrentProduct = [Product]
            VAR _CurrentActual =
                CALCULATE (
                    SUM ( Actual[Qty] );
                    Actual[Customer] = _CurrentCustomer;
                    Actual[Product] = _CurrentProduct
                )
            RETURN
                _CurrentActual
        );
        "Diff. Qty"; [Actual-Qty] - [Plan-Qty]
    )

Código formateado con www.daxformatter.com

Ashish_Mathur

Hola,

Puede descargar mi archivo PBI desde aquí.

Espero que esto ayude.

Sin título.png

Alba

Hola @bluetronics

Aunque creo que sería más conveniente hacer esto en el editor de consultas (M), también puedes intentar crear una nueva tabla calculada con DAX:

TestTable =
VAR _BaseTable =
    DISTINCT (
        UNION (
            SUMMARIZECOLUMNS ( Actual[Customer]; Actual[Product] );
            SUMMARIZECOLUMNS ( Plan[Customer]; Plan[Product] )
        )
    )
RETURN
    ADDCOLUMNS (
        _BaseTable;
        "Difference"; LOOKUPVALUE (
            Actual[Qty];
            Actual[Customer]; [Customer];
            Actual[Product]; [Product]
        )
            - LOOKUPVALUE ( Plan[Qty]; Plan[Customer]; [Customer]; Plan[Product]; [Product] )
    )

Código formateado con www.daxformatter.com

bluetronics

En respuesta a Alba

HOLA @ AIB,

Su instrucción fue excelente para trabajar en general, pero tuve un problema con «Se proporcionó una tabla de valores múltiples donde se esperaba un valor único». cuando aplico a big data. Y lo encontré por qué, pero no sé cómo solucionar el problema. ¿Puedes ayudarme de nuevo?

Puedo ver el mensaje de error cuando hay diferentes valores de búsqueda. ¿Sabe cómo hacerlo si quiero sumar la cantidad para el mismo cliente y producto?

20190119_014109.png

Saludos,

Alba

En respuesta a bluetronics

@bluetronics

NewTable = 
VAR _BaseTable =
    DISTINCT (
        UNION (
            SUMMARIZECOLUMNS ( Actual[Customer]; Actual[Product] );
            SUMMARIZECOLUMNS ( Plan[Customer]; Plan[Product] )
        )
    )
RETURN
    ADDCOLUMNS (
        _BaseTable;
        "Difference"; 
        VAR _CurrentCustomer=[Customer]
        VAR _CurrentProduct=[Product] 
        RETURN 
           CALCULATE(SUM(Actual[Qty]); Actual[Customer]=_CurrentCustomer; Actual[Product]=_CurrentProduct)
           - CALCULATE(SUM(Plan[Qty]); Plan[Customer]=_CurrentCustomer; Plan[Product]=_CurrentProduct)
    )

Alba

En respuesta a Alba

@bluetronics

Puedes hacerlo siguiendo la misma lógica, agregando más columnas a través de ADDCOLUMNS:

NewTableExtended = 
VAR _BaseTable =
    DISTINCT (
        UNION (
            SUMMARIZECOLUMNS ( Actual[Customer]; Actual[Product] );
            SUMMARIZECOLUMNS ( Plan[Customer]; Plan[Product] )
        )
    )
RETURN
    ADDCOLUMNS (
        _BaseTable;
        "Plan-Qty";
        VAR _CurrentCustomer = [Customer]
        VAR _CurrentProduct = [Product]
        VAR _CurrentPlan =
            CALCULATE (
                SUM ( Plan[Qty] );
                Plan[Customer] = _CurrentCustomer;
                Plan[Product] = _CurrentProduct
            )
        RETURN
            _CurrentPlan;
        "Actual-Qty";
        VAR _CurrentCustomer = [Customer]
        VAR _CurrentProduct = [Product]
        VAR _CurrentActual =
            CALCULATE (
                SUM ( Actual[Qty] );
                Actual[Customer] = _CurrentCustomer;
                Actual[Product] = _CurrentProduct
            )
        RETURN
            _CurrentActual;
        "Diff. Qty";
        VAR _CurrentCustomer = [Customer]
        VAR _CurrentProduct = [Product]
        VAR _CurrentActual =
            CALCULATE (
                SUM ( Actual[Qty] );
                Actual[Customer] = _CurrentCustomer;
                Actual[Product] = _CurrentProduct
            )
        VAR _CurrentPlan =
            CALCULATE (
                SUM ( Plan[Qty] );
                Plan[Customer] = _CurrentCustomer;
                Plan[Product] = _CurrentProduct
            )
        RETURN
            _CurrentActual - _CurrentPlan
    )

Código formateado con www.daxformatter.com

Alba

En respuesta a Alba

@bluetronics

O, en realidad, podríamos tener otra versión con dos COLUMNAS ADICIONALES anidadas para hacer que el código sea un poco menos detallado y evitar algunos recálculos que supongo que serían más rápidos, aunque no puedo estar seguro al respecto.

NewTableExtended_v2 = 
VAR _BaseTable =
    DISTINCT (
        UNION (
            SUMMARIZECOLUMNS ( Actual[Customer]; Actual[Product] );
            SUMMARIZECOLUMNS ( Plan[Customer]; Plan[Product] )
        )
    )
RETURN
    ADDCOLUMNS (
        ADDCOLUMNS (
            _BaseTable;
            "Plan-Qty";
            VAR _CurrentCustomer = [Customer]
            VAR _CurrentProduct = [Product]
            VAR _CurrentPlan =
                CALCULATE (
                    SUM ( Plan[Qty] );
                    Plan[Customer] = _CurrentCustomer;
                    Plan[Product] = _CurrentProduct
                )
            RETURN
                _CurrentPlan;
            "Actual-Qty";
            VAR _CurrentCustomer = [Customer]
            VAR _CurrentProduct = [Product]
            VAR _CurrentActual =
                CALCULATE (
                    SUM ( Actual[Qty] );
                    Actual[Customer] = _CurrentCustomer;
                    Actual[Product] = _CurrentProduct
                )
            RETURN
                _CurrentActual
        );
        "Diff. Qty"; [Actual-Qty] - [Plan-Qty]
    )

Código formateado con www.daxformatter.com

Alba

En respuesta a Alba

@bluetronics

y como parece que tengo ganas de escribir hoy, aquí hay otra versión sin variables. Parecería más simple (también porque mantengo CALCULATE en la misma línea), pero podría ser un poco menos fácil de seguir y, por lo tanto, de mantener. Cuestión de gustos supongo.

NewTableExtended_v3= 
VAR _BaseTable =
    DISTINCT (
        UNION (
            SUMMARIZECOLUMNS ( Actual[Customer]; Actual[Product] );
            SUMMARIZECOLUMNS ( Plan[Customer]; Plan[Product] )
        )
    )
RETURN
    ADDCOLUMNS (
        ADDCOLUMNS (
            _BaseTable;
            "Plan-Qty"; CALCULATE (SUM ( Plan[Qty] ); Plan[Customer] = EARLIER ( [Customer] );Plan[Product] = EARLIER ( [Product] ));
            "Actual-Qty"; CALCULATE (SUM ( Actual[Qty] ); Actual[Customer] = EARLIER ( [Customer] ); Actual[Product] = EARLIER ( [Product] )
            )
        );
        "Diff. Qty"; [Actual-Qty] - [Plan-Qty]
    )

Está bien. Suficientes versiones carita feliz

bluetronics

En respuesta a Alba

¡¡Súper!! Todos los ejemplos son muy valiosos para mí. Ten un buen fin de semana. carita feliz

bluetronics

En respuesta a Alba

Hola @AlB y @Ashish_Mathur

¿Puede decirme cómo mostrar datos adicionalmente?

20190119_155231.png

Atentamente,

Ashish_Mathur

En respuesta a bluetronics

Hola,

En el Editor de consultas, simplemente debe eliminar el último paso «Eliminar columnas».

bluetronics

En respuesta a Ashish_Mathur

Hola @Ashish_Mathur,

Me gustaría saber cómo trabajar con DAX. Gracias.

bluetronics

En respuesta a Alba

¡¡Súper!! Gracias. 🙂

bluetronics

En respuesta a Alba

Hola @AIB,

¡Muchas gracias! funciona exactamente como me gustaría ver.

Atentamente,

SH Lee

Deja un comentario

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