# Arithmetic Measure

Arithmetic measures allow you to perform simple calculations with measures in a visualization. A calculated arithmetic measure always references two measures, therefore the visualization must contain two measures at least.

## Supported operations

Although a visualization can contain multiple measures, you can perform arithmetic operations with exactly only two measures.

The following arithmetic operations are supported:

OperationArithmetic measure operatorExpression formulaExample
Sum`sum`=A+B= Q1 revenue + Q2 revenue
Difference`difference`=A-B= revenue in 2017 - revenue in 2016
Product (Multiplication)`multiplication`=A*B= price per unit * number of units
Ratio`ratio`=A÷B= gross profit / net sales
Change`change`=(A-B)÷B= (this month revenue - last month revenue) / last month revenue

By default, the result data of a `change` operation is returned as a percentage in the `#,##0.00%` format. The format cannot be overridden.

All the other operations return data in the default `#,##0.00` format. To change the format, use the `format` attribute of the measure (see the examples).

## Arithmetic measure structure

To add an arithmetic measure to a visualization, use the `newArithmeticMeasure` factory function:

``````newArithmeticMeasure(operands, operator, modifications)
``````

An arithmetic measure can reference the following as its operand:

You can specify operands either by their `localIdentifier` or by their value, and the factory function will extract the local identifier for you.

The operator can be one of the following:

• `sum`
• `difference`
• `multiplication`
• `ratio`
• `change`

The modifications part is optional and is a function with a single parameter, which is an object with functions that you can use to override the measure’s `format()` or `alias()`.

If arithmetic measures reference each other in an infinite loop or the referenced measure is not found in the visualization (there is no measure with the referenced localIdentifier), the error message is rendered instead of the visualization.

## Examples

### A difference between two measures - arithmetic measure constructed using localIdentifier references

``````import { newMeasure, newArithmeticMeasure } from "@gooddata/sdk-model";
import { PivotTable } from "@gooddata/sdk-ui-pivot";

const measures = [
// the first simple measure (operand)
newMeasure("boughtProductsIdentifier", m => m.alias("Bought products from supplier")),
newMeasure("soldProductsLocalIdentifier", m => m.alias("Sold products to customers")),
newArithmeticMeasure(
["boughtProductsLocalIdentifier", "soldProductsLocalIdentifier"],
"difference",
m => m.alias("Products remaining in warehouse")
)
];

<PivotTable
measures={measures}
/>
``````

### Calculation with a derived measure (percentage change between two years)

The result of a `change` operation is returned as a percentage value in the default `#,##0.00%` format. This example demonstrates passing measures by value to the different measure factory functions.

``````import { newMeasure, newPopMeasure, newArithmeticMeasure } from "@gooddata/sdk-model";
import { PivotTable } from "@gooddata/sdk-ui-pivot";

const currentYear = newMeasure("measureIdentifier", m => m.alias("Current Year"));
// derived - data from previous year
const previousYear = newPopMeasure(currentYear, "attributeDisplayFormYearIdentifier", m => m.alias("Previous Year"));
// arithmetic measure with custom format
const change = newArithmeticMeasure(previousYear, currentYear, "change", m => m.alias("Change between years").format("\$#,#0.0%"));

const measures = [
currentYear,
previousYear,
change
];

<PivotTable
measures={measures}
/>
``````