Worked example

Build a SAP margin history without filling the gaps

An eleven-period SAP sample with a missing revenue value demonstrates honest tables, chart gaps and mixed-source financial history.

The short answer

Our stored SAP sample includes annual periods from 2015 to 2025, but revenue is missing for 2017. That year’s operating margin must remain missing. An eleven-year span is not the same as eleven complete, comparable observations.

Jump to a section

A longer history can still be incomplete

Our stored SAP sample spans 2015–2025. Its 2017 row has operating income but no revenue, so an operating-margin calculation for that period has no denominator. Replacing the missing value with zero would create a meaningless result; interpolating revenue would introduce an estimate that is not in the source record.

Try this research prompt
Resolve SAP and check the annual statement periods available. Build an operating-margin history using operating income divided by revenue. Keep missing values missing, leave gaps in the chart, and identify each row’s source and currency. Flag changes of source, accounting basis and report version. Do not describe the series as complete or comparable until those checks pass.
Connect the MCP server first. A prompt requests an analysis; it does not guarantee that the required data exists.

Keep the missing year visible

0%10%20%30%40%2015-12-31: 20.4%20152016-12-31: 23.3%×20172018-12-31: 23.1%2019-12-31: 16.2%20192020-12-31: 24.2%2021-12-31: 23.4%20212022-12-31: 20.0%2023-12-31: 18.6%20232024-12-31: 13.6%2025-12-31: 26.1%2025
Operating income ÷ revenue × 100. Annual periods; EUR. Stored sample from 4 October 2026. Mixed stored sources. The gap marks missing 2017 revenue; no margin is calculated for that year.
SAP stored annual sample · amounts in EUR billions · margins calculated from unrounded values
Period endRevenueOperating incomeMarginRecord source
2015-12-3120.7934.25220.4%SEC XBRL record
2016-12-3122.0625.13523.3%SEC XBRL record
2017-12-31Not available4.877Not availableBundesanzeiger record
2018-12-3124.7085.70323.1%Bundesanzeiger record
2019-12-3127.5534.47316.2%Bundesanzeiger record
2020-12-3127.3386.62324.2%ESEF source ↗
2021-12-3126.9536.30823.4%SEC XBRL record
2022-12-3129.5205.91420.0%SEC XBRL record
2023-12-3131.2075.79918.6%SEC XBRL record
2024-12-3134.1764.66513.6%SEC XBRL record
2025-12-3136.8009.61726.1%SEC XBRL record

The table preserves the requested period even when the calculation is unavailable. A line should stop at the missing observation and resume at the next complete one. Connecting the points across 2017 would suggest continuity that we have not established.

This sample combines SEC XBRL, Bundesanzeiger and ESEF records. The source column describes the stored records; it does not prove that every historical value was manually reconciled to a specific original document.

Check comparability before telling a story

Consistent field names are useful, but they do not settle accounting comparability. Ask whether the observations cover the same reporting entity, consolidation scope, annual duration, currency and measure definition. An acquisition, discontinued operation or restatement may change the interpretation of a trend even when every cell is populated.

  1. Ask for all required years and compare that list with the returned periods.
  2. Check for multiple records for the same year. Choose a report version deliberately rather than averaging duplicates.
  3. Retain source labels and filing identifiers. Locate the original report when the comparison matters.
  4. State which observations are missing or still require reconciliation.

A useful answer includes the unresolved work

A defensible answer could say: “The stored series contains eleven annual periods and ten calculable margins; 2017 revenue is missing. Sources differ, so this is a starting table for reconciliation.” That is more useful than presenting a smooth chart as a finished accounting comparison.

For a simpler calculation with direct ESEF source links, use the ASML example.

A report-period history is not a point-in-time backtest

A row for 2015 tells you which reporting period it describes. It does not, by itself, tell you when that version of the number became available to an investor. Later reports can restate earlier periods, and a source-normalization change can alter an imported field.

Before a backtest, establish the publication/availability date and report vintage for every observation. This dated mixed-source sample is a missing-data demonstration, not a validated point-in-time series. Downloading it does not remove that distinction.

For an accounting comparison, inspect original reports and choose a consistent definition. Keep 2017 as a visible gap until the relevant source and mapping are verified.

Reproduce the example

Take the numbers with you.

Dated sample · 4 October 2026 · Public download · No account required

Mixed stored sources; comparability and historical report versions require verification. Amounts use full currency units; CSV empty numeric cells mean missing values, not zero. These downloads use the same stored inputs as the article.

Sources and further reading

Put your next company question to work.

Free testing · No payment required · 300 successful data requests per account per UTC day

Create a free account →