Detect 80/20 Value Concentration in SAP Analytics Cloud Using Pareto Analysis

This article demonstrates how to implement Pareto (80/20) analysis in SAP Analytics Cloud using table ResultSet scripting.

The script retrieves values from a table, sorts members by their contribution, and calculates the cumulative percentage of the total value.
It then identifies how many members generate approximately 80% of the total,
providing a powerful insight into value concentration within the dataset.

// Get result set
var resultSet = Table_1.getDataSource().getResultSet();
var rowDims = Table_1.getDimensionsOnRows();

if (resultSet.length > 0 && rowDims.length > 0)
{
    var dimId = rowDims[0];
    var count = resultSet.length;

    // ----------------------------
    // Create arrays
    // ----------------------------
    var values = ArrayUtils.create(Type.number);
    var names = ArrayUtils.create(Type.string);

    var total = 0.0;

    for (var i = 0; i < count; i++)
    {
        var value = ConvertUtils.stringToNumber(resultSet[i][Alias.MeasureDimension].rawValue);

        values[i] = value;
        names[i] = resultSet[i][dimId].description;

        total = total + value;
    }

    // ----------------------------
    // Sort values descending
    // ----------------------------
    for (var a = 0; a < values.length; a++)
    {
        for (var b = 0; b < values.length - 1; b++)
        {
            if (values[b] < values[b + 1])
            {
                var tempVal = values[b];
                values[b] = values[b + 1];
                values[b + 1] = tempVal;

                var tempName = names[b];
                names[b] = names[b + 1];
                names[b + 1] = tempName;
            }
        }
    }

    // ----------------------------
    // Calculate cumulative %
    // ----------------------------
    var runningTotal = 0.0;
    var paretoCount = 0;

    for (var k = 0; k < values.length; k++)
    {
        runningTotal = runningTotal + values[k];
        paretoCount = paretoCount + 1;

        var pct = (runningTotal / total) * 100.0;

        if (pct >= 80.0)
        {
            break;
        }
    }

    // ----------------------------
    // Output result
    // ----------------------------
    var pctRounded = Math.round((runningTotal / total) * 1000.0) / 10.0;

    var text =
        ConvertUtils.numberToString(paretoCount) +
        " members generate " +
        ConvertUtils.numberToString(pctRounded) +
        "% of the total value.";

    Text_1.applyText(text);
}
Code language: JavaScript (javascript)
Scroll to Top