DISTRIBUTE

DISTRIBUTE('OriginalNode', 'DistributionNode' [, "Level1", ...])

In Dimensionality & hierarchies

The DISTRIBUTE function distributes the values of the Original Node based on the value distribution from the Distribution Node in relation to the aggregated values of the Distribution Node when rolled up to the levels of the Original Node.

Use this function when you want to allocate aggregated values down to more detailed level values based on a weighting node: DISTRIBUTE('OPEX', 'Revenue', "Product").

Parameters

Original NodeNode referenceRequired
Input node whose values should be distributed, specified in single quotes (e.g.'OPEX')
Distribution NodeNode referenceRequired
Node whose value distribution provides the weights for disaggregation (e.g.'Revenue'). Must contain all levels of the Original Node.
LevelLevel nameOptional
One or more level names to restrict which levels the Original Node is distributed to (e.g."Product"). If not specified, all additional levels in the Distribution Node are used.

Output shape

Dimensionality
Increases. The output contains all levels from the Original Node plus the distribute levels from the Distribution Node.
Values
Each input value is split proportionally based on the weights in the Distribution Node. The total sum is preserved.
Row count
Expands to include one row per combination of original levels and distribute level values.

Watch out

  • Values with missing partners in the Distribution Node will be evenly distributed to all values in the respective dimension level. This can create a large data set with sparse inputs.
  • When the sum of distribution weights is zero for a partition, the input value is distributed evenly across all non-null entries in that partition.
  • The Distribution Node must contain all levels of the Original Node. If it is coarser than the Original Node in any dimension, a validation error occurs.
  • The Original Node must not already have the distribute level. You cannot distribute to a level that already exists on the input.
  • If the distribution is executed on a dimension with a hierarchy and the chosen distribute level is a higher level, the distribution is calculated on the lowest shared level and afterwards aggregated to the specified level.
  • Filters on the distribute level’s dimension are removed during calculation and applied to the result afterwards.

Examples

Distribute across all additional levels

This example distributes OPEX to the detailed product level using revenue as the weighting node.

Input node: 'OPEX'

YearOPEX
20252000
20264000
202712000

Input node: 'Revenue'

Product LineProduct20252026
MM1100200
MM2300600
ZZ3400800

Formula: DISTRIBUTE('OPEX', 'Revenue')

Product LineProduct202520262027
MM12000 * 100 / 800 = 2504000 * 200 / 1600 = 50012000 / 4 = 3000
MM22000 * 300 / 800 = 7504000 * 600 / 1600 = 150012000 / 4 = 3000
ZZ32000 * 400 / 800 = 10004000 * 800 / 1600 = 200012000 / 4 = 3000
XX4--12000 / 4 = 3000
Totals2000400012000

For 2025 and 2026, each product’s share is calculated as: OPEX * (product revenue / total revenue). For 2027, no revenue data exists, so the value is evenly distributed across all 4 products. The totals are preserved in every year.

Restrict the distribution to selected levels

This example restricts the distribution to "Year" and "Product Line", so the result stays aggregated at product-line level instead of distributing down to each product.

Formula: DISTRIBUTE('OPEX', 'Revenue', "Year", "Product Line")

Product Line202520262027
M2000 * 400 / 800 = 10004000 * 800 / 1600 = 200012000 / 3 = 4000
Z2000 * 400 / 800 = 10004000 * 800 / 1600 = 200012000 / 3 = 4000
X--12000 / 3 = 4000
Totals2000400012000

By specifying "Product Line" instead of "Product", the distribution stays at the coarser level. Revenue for product line M is the sum of M1 and M2 (100 + 300 = 400 in 2025). Totals are again preserved.

See also

REDISTRIBUTE
When allocation should happen only within defined clusters or groups instead of across the full available detail.
REBOOK
When values should be moved from one level value to another instead of being split across multiple level values using weights.
Was this page helpful?