Forum Discussion

Syndicate_Admin's avatar
Syndicate_Admin
Icon for Administrator rankAdministrator
11 months ago
Solved

Matriz visual personalizada

Hola de nuevo,

Estaba buscando en la web y también tratando de construir una solución (también con la ayuda de ChatGPT, pero sin éxito):
Necesito construir una especie de Matrix Visual, donde tengo las ventas netas reales por mes del año seleccionado. Luego, en una columna adicional, tengo, por razones de comparación, el presupuesto YTD por mes. Luego dos tipos de desviaciones: una frente al presupuesto, la otra frente al año anterior. Y por último, pero no menos importante, la desviación en términos de volúmenes frente al presupuesto y el año anterior.

Todas las medidas individuales están disponibles y se calculan correctamente. Pero no puedo construirlos en una sola imagen. ¿Hay alguna solución para este tipo de Matrix?

¡Gracias por cualquier ayuda, consejo y truco!

  • Syndicate_Admin's avatar
    Syndicate_Admin
    10 months ago

    Hola v-dineshya,
    Gracias por tu respuesta. Hoy, he tenido tiempo de trabajar más en este tema, y usted aconseja con la tabla desconectada trajo la solución:

    aquí está el código que utilicé para la tabla:

    Display = 
    DATATABLE(
        "Label", STRING, "Sort", INTEGER, "Kind", STRING, "MonthNo", INTEGER,
        {
            {"Jan",  1, "Month", 1},
            {"Feb",  2, "Month", 2},
            {"Mrc",  3, "Month", 3},
            {"Apr",  4, "Month", 4},
            {"May",  5, "Month", 5},
            {"Jun",  6, "Month", 6},
            {"Jul",  7, "Month", 7},
            {"Aug",  8, "Month", 8},
            {"Sep",  9, "Month", 9},
            {"Oct", 10, "Month",10},
            {"Nov", 11, "Month",11},
            {"Dec", 12, "Month",12},
            {"Budget",            100, "KPI", BLANK()},
            {"YTD vs BUD [abs.]",        101, "KPI", BLANK()},
            {"YTD vs BUD [%]",        102, "KPI", BLANK()},
            {"YTD vs PY [abs.]",         103, "KPI", BLANK()},
            {"YTD vs PY [%]",         104, "KPI", BLANK()},
            {"YTD volume vs Budget [%]",105, "KPI", BLANK()},
            {"YTD volume vs PY [%]",106, "KPI", BLANK()}
        }
    )

    Ahora, tengo el mes, una columna para el presupuesto y mis desviaciones.

    Para llenar de vida las columnas, utilicé esta medida:

    Display Value = 
    VAR _kind  = SELECTEDVALUE ( Display[Kind] )
    VAR _label = SELECTEDVALUE ( Display[Label] )
    VAR _mno   = SELECTEDVALUE ( Display[MonthNo] )
    VAR _scale = 1000000.0
    
    VAR _year =
        COALESCE (
            SELECTEDVALUE ( GemeinsameJahre[Year] ),
            CALCULATE ( MAX ( 'Sales Data'[Year] ), REMOVEFILTERS ( Display ) )
        )
    VAR _lastM =
        CALCULATE (
            MAX ( 'Sales Data'[Posting period] ),
            KEEPFILTERS ( 'Sales Data'[Year] = _year ),
            KEEPFILTERS ( 'Sales Data'[Scenario] = "Actual" ),
            REMOVEFILTERS ( Display )
        )
    
    VAR _ytdFilter =
        FILTER (
            ALL ( 'Sales Data'[Year], 'Sales Data'[Posting period] ),
            'Sales Data'[Year] = _year &&
            'Sales Data'[Posting period] <= _lastM
        )
    
    VAR _pyYtdFilter =
        FILTER (
            ALL ( 'Sales Data'[Year], 'Sales Data'[Posting period] ),
            'Sales Data'[Year] = _year - 1 &&
            'Sales Data'[Posting period] <= _lastM
        )
    VAR _fullYearBudget =
        CALCULATE (
            [BudgetNS_in_RC],
            ALL('Sales Data'[Year],'Sales Data'[Posting period]),
            'Sales Data'[Year] = _year  
        )
    VAR _hasMonthlyBudget =
        NOT ISBLANK (
            CALCULATE (
                [BudgetNS_in_RC],
                KEEPFILTERS ( 'Sales Data'[Year] = _year ),
                KEEPFILTERS ( 'Sales Data'[Posting period] = _lastM )
            )
        )
    VAR _ytdBudAdj =
        IF (
            _hasMonthlyBudget,
            CALCULATE ( [BudgetNS_in_RC], _ytdFilter ),
            _fullYearBudget * DIVIDE ( _lastM, 12 )
        )
    VAR _ytdAct   = CALCULATE ( [ACT_NS_in_RC],     _ytdFilter )
    VAR _ytdAbs = _ytdAct - _ytdBudAdj
    VAR _ytdBud   = CALCULATE ( [BudgetNS_in_RC])
    VAR _pyYtdAct =     CALCULATE( [PY_NS_in_RC],  _pyYtdFilter)
    VAR _ytdPct = DIVIDE ( _ytdAbs, _ytdBudAdj )
    
    VAR _ytdVolAct = CALCULATE ( [ActMT],       _ytdFilter )
    VAR _ytdVolBud = CALCULATE ( [BudgetMT],    _ytdFilter )
    VAR _pyYtdVol  = CALCULATE ( [PY_MT],       _pyYtdFilter )
    VAR _volPctBud = DIVIDE ( _ytdVolAct - _ytdVolBud, _ytdVolBud )
    VAR _volPctPY  = DIVIDE ( _ytdVolAct - _pyYtdVol,  _pyYtdVol  )
    
    RETURN
    SWITCH (
        TRUE (),
    
        _kind = "Month",
            CALCULATE ( [ACT_NS_in_RC],
                KEEPFILTERS ( 'Sales Data'[Year] = _year ),
                KEEPFILTERS ( 'Sales Data'[Posting period] = _mno )
            ) / _scale,
    
        _label = "Budget",
            _ytdBud / 12 / _scale,
    
        _label = "YTD vs BUD [abs.]", 
            _ytdAbs / _scale,
    
        _label = "YTD vs BUD [%]",    
            _ytdPct*100,
    
        _label = "YTD vs PY [abs.]",
            ( _ytdAct - _pyYtdAct ) / _scale,
    
        _label = "YTD vs PY [%]",
            DIVIDE ( _ytdAct - _pyYtdAct, _pyYtdAct )*100,
    
        _label = "YTD volume vs Budget [%]",
            _volPctBud*100,
    
        _label = "YTD volume vs PY [%]",
            _volPctPY*100,
    
        BLANK ()
    )


    Ahora, usaré algo de tiempo para pulir la tabla e intentaré llevar las columnas % al formato % (al menos, se muestra ese signo %). Quizás, también encuentre una solución, para mostrar algunos bordes de tabla para la columna de presupuesto, por lo que es mejor leer. Pero solo en términos de tema, la tabla está terminada y su pista con la tabla desconectada es la solución. ¡Gracias!

6 Replies

  • Hola, @Pfoster ,
    La matriz funciona de manera que para cada medida que se pone en valores, cada valor en una columna de "Columnas" también recalcula esta medida. Entonces, si pones el mes del año en "Columnas", obtendrás todas las medidas para cada mes del año.

    Si desea el mismo comportamiento que en su imagen, donde cada cálculo a veces está presente en una columna en particular y a veces no, tendrá que construir medidas personalizadas para imitar esto y eliminar 'Columnas'. Probablemente no haya un configurador integrado de arrastrar y soltar fácil para esto.

  • Gracias. Tenía miedo de que esa fuera la respuesta... hmm, tal vez, encontraré una solución para llegar a un resultado similar

  • Hola @Pfoster ,

    Gracias por ponerse en contacto con el foro de la comunidad de Microsoft.

    Hola @vojtechsima , Gracias por tu pronta respuesta.

    Hola @Pfoster , Power BI Matrix admite jerarquías de filas y columnas, pero no permite grupos de columnas arbitrarios como "SALES" y "VOLUME" con medidas mixtas.


    Por favor, pruebe las siguientes soluciones alternativas..

    1. Cree una tabla desconectada para encabezados de columna como "Enero", "Febrero", "YTD vs Abs de presupuesto", "YTD vs % de presupuesto". Use SWITCH() en una medida para devolver el valor correcto en función de la columna seleccionada. Enlazar esta tabla como columnas en un objeto visual de Matrix.

    2. Cree parámetros de campo para medidas como Real, Presupuesto, Varianza, Variación de volumen. Combinar con una jerarquía de meses.

    3. Utilice un objeto visual personalizado como Inforiver, Zebra BI y Acterys Matrix. Estos admiten encabezados de varios niveles, columnas de varianza y formato avanzado.

    Espero que esta información ayude. Por favor, háganos saber si tiene más preguntas.

    Saludos

    Dinesh

    • Syndicate_Admin's avatar
      Syndicate_Admin
      Icon for Administrator rankAdministrator

      Hola @Pfoster ,

      No hemos tenido noticias tuyas sobre la última respuesta y solo estábamos revisando para ver si ya tienes una resolución. Y, si tiene alguna otra consulta, háganoslo saber.

      Saludos

      Dinesh

    • Syndicate_Admin's avatar
      Syndicate_Admin
      Icon for Administrator rankAdministrator

      Hola v-dineshya,
      Gracias por tu respuesta. Hoy, he tenido tiempo de trabajar más en este tema, y usted aconseja con la tabla desconectada trajo la solución:

      aquí está el código que utilicé para la tabla:

      Display = 
      DATATABLE(
          "Label", STRING, "Sort", INTEGER, "Kind", STRING, "MonthNo", INTEGER,
          {
              {"Jan",  1, "Month", 1},
              {"Feb",  2, "Month", 2},
              {"Mrc",  3, "Month", 3},
              {"Apr",  4, "Month", 4},
              {"May",  5, "Month", 5},
              {"Jun",  6, "Month", 6},
              {"Jul",  7, "Month", 7},
              {"Aug",  8, "Month", 8},
              {"Sep",  9, "Month", 9},
              {"Oct", 10, "Month",10},
              {"Nov", 11, "Month",11},
              {"Dec", 12, "Month",12},
              {"Budget",            100, "KPI", BLANK()},
              {"YTD vs BUD [abs.]",        101, "KPI", BLANK()},
              {"YTD vs BUD [%]",        102, "KPI", BLANK()},
              {"YTD vs PY [abs.]",         103, "KPI", BLANK()},
              {"YTD vs PY [%]",         104, "KPI", BLANK()},
              {"YTD volume vs Budget [%]",105, "KPI", BLANK()},
              {"YTD volume vs PY [%]",106, "KPI", BLANK()}
          }
      )

      Ahora, tengo el mes, una columna para el presupuesto y mis desviaciones.

      Para llenar de vida las columnas, utilicé esta medida:

      Display Value = 
      VAR _kind  = SELECTEDVALUE ( Display[Kind] )
      VAR _label = SELECTEDVALUE ( Display[Label] )
      VAR _mno   = SELECTEDVALUE ( Display[MonthNo] )
      VAR _scale = 1000000.0
      
      VAR _year =
          COALESCE (
              SELECTEDVALUE ( GemeinsameJahre[Year] ),
              CALCULATE ( MAX ( 'Sales Data'[Year] ), REMOVEFILTERS ( Display ) )
          )
      VAR _lastM =
          CALCULATE (
              MAX ( 'Sales Data'[Posting period] ),
              KEEPFILTERS ( 'Sales Data'[Year] = _year ),
              KEEPFILTERS ( 'Sales Data'[Scenario] = "Actual" ),
              REMOVEFILTERS ( Display )
          )
      
      VAR _ytdFilter =
          FILTER (
              ALL ( 'Sales Data'[Year], 'Sales Data'[Posting period] ),
              'Sales Data'[Year] = _year &&
              'Sales Data'[Posting period] <= _lastM
          )
      
      VAR _pyYtdFilter =
          FILTER (
              ALL ( 'Sales Data'[Year], 'Sales Data'[Posting period] ),
              'Sales Data'[Year] = _year - 1 &&
              'Sales Data'[Posting period] <= _lastM
          )
      VAR _fullYearBudget =
          CALCULATE (
              [BudgetNS_in_RC],
              ALL('Sales Data'[Year],'Sales Data'[Posting period]),
              'Sales Data'[Year] = _year  
          )
      VAR _hasMonthlyBudget =
          NOT ISBLANK (
              CALCULATE (
                  [BudgetNS_in_RC],
                  KEEPFILTERS ( 'Sales Data'[Year] = _year ),
                  KEEPFILTERS ( 'Sales Data'[Posting period] = _lastM )
              )
          )
      VAR _ytdBudAdj =
          IF (
              _hasMonthlyBudget,
              CALCULATE ( [BudgetNS_in_RC], _ytdFilter ),
              _fullYearBudget * DIVIDE ( _lastM, 12 )
          )
      VAR _ytdAct   = CALCULATE ( [ACT_NS_in_RC],     _ytdFilter )
      VAR _ytdAbs = _ytdAct - _ytdBudAdj
      VAR _ytdBud   = CALCULATE ( [BudgetNS_in_RC])
      VAR _pyYtdAct =     CALCULATE( [PY_NS_in_RC],  _pyYtdFilter)
      VAR _ytdPct = DIVIDE ( _ytdAbs, _ytdBudAdj )
      
      VAR _ytdVolAct = CALCULATE ( [ActMT],       _ytdFilter )
      VAR _ytdVolBud = CALCULATE ( [BudgetMT],    _ytdFilter )
      VAR _pyYtdVol  = CALCULATE ( [PY_MT],       _pyYtdFilter )
      VAR _volPctBud = DIVIDE ( _ytdVolAct - _ytdVolBud, _ytdVolBud )
      VAR _volPctPY  = DIVIDE ( _ytdVolAct - _pyYtdVol,  _pyYtdVol  )
      
      RETURN
      SWITCH (
          TRUE (),
      
          _kind = "Month",
              CALCULATE ( [ACT_NS_in_RC],
                  KEEPFILTERS ( 'Sales Data'[Year] = _year ),
                  KEEPFILTERS ( 'Sales Data'[Posting period] = _mno )
              ) / _scale,
      
          _label = "Budget",
              _ytdBud / 12 / _scale,
      
          _label = "YTD vs BUD [abs.]", 
              _ytdAbs / _scale,
      
          _label = "YTD vs BUD [%]",    
              _ytdPct*100,
      
          _label = "YTD vs PY [abs.]",
              ( _ytdAct - _pyYtdAct ) / _scale,
      
          _label = "YTD vs PY [%]",
              DIVIDE ( _ytdAct - _pyYtdAct, _pyYtdAct )*100,
      
          _label = "YTD volume vs Budget [%]",
              _volPctBud*100,
      
          _label = "YTD volume vs PY [%]",
              _volPctPY*100,
      
          BLANK ()
      )


      Ahora, usaré algo de tiempo para pulir la tabla e intentaré llevar las columnas % al formato % (al menos, se muestra ese signo %). Quizás, también encuentre una solución, para mostrar algunos bordes de tabla para la columna de presupuesto, por lo que es mejor leer. Pero solo en términos de tema, la tabla está terminada y su pista con la tabla desconectada es la solución. ¡Gracias!