The investment committee pack had a number in it that was wrong for six quarters. Nobody noticed because it had two decimal places and a reasonable magnitude.

An analyst pulled fund-level internal rates of return into a pivot table for the quarterly review. The individual fund rows showed 10%, 12%, and 8%. The grand total row at the bottom showed 10%. The actual portfolio IRR, computed from the pooled cash flows, was 8.4%. The 160-basis-point gap went unnoticed because the total row sat directly beneath the individual funds, and the neighboring columns—total commitment and paid-in capital—summed correctly. The plausible numbers lent credibility to the invalid one.

The total row needs a calculation, not a formatting convention.

A fund-level IRR is a summary of a cash flow stream. It is the root of a polynomial equation derived from a sequence of dated capital calls and distributions. Once you have collapsed the stream into a single percentage, you cannot recover it by arithmetic. The pivot table does not know this. It offers Sum, Count, Average, Max, and Min. The analyst selects Average. The tool complies. The result is a number that is mathematically precise and refers to nothing. You cannot average a polynomial root.

The same failure applies to any metric expressed as a fraction. A fee analysis averages expense ratios across funds with different assets under management. A small fund with a 2.5% fee and a large fund with a 0.4% fee produce an unweighted average of 1.45%. The actual weighted expense ratio is 0.6%. A ratio of sums is not the sum of ratios, and it is not the average of ratios.

Time-weighted and money-weighted returns answer different questions, and neither can be averaged. Money-weighted return reflects the timing and size of contributions and withdrawals; it answers what the investor actually earned. Time-weighted return strips out cash flow timing to judge the manager’s performance. Averaging time-weighted returns across accounts destroys the isolation of the manager’s performance. Averaging money-weighted returns destroys the timing reality of the capital allocation. When the investment committee asks about the investor’s experience and the report answers with a manager’s performance metric, the gap is the timing of the cash flows.

The semantic layer is where non-additive measures go to die.

The root cause is a gap in how the data is modeled. IT controls the data types: string, float, integer. Finance understands the financial types: cash flow, ratio, rate of return. The business intelligence tool sits in the middle, treating every float as an additive quantity. The semantic layer defines the measure as a column, not as a calculation over a fact table.

When a user drags a continuous variable into the values field of a dashboard, the tool defaults to Sum or Average. It will aggregate anything you put in the Values area. It has no opinion about whether the result means anything. A dashboard will happily sum your time-weighted returns and tell you your low-risk bond portfolio doubled in value overnight.

Users often try to fix an un-averageable metric by applying a weighted average, such as weighting fund IRRs by net asset value. This produces a number that looks highly precise and is still mathematically invalid. IRR is a nonlinear function of the cash flow stream. Unequal cash-flow dates are the problem, not merely unequal fund sizes. If a weighted average IRR happens to match the true pooled IRR, it is by coincidence, usually when cash flows follow identical timing and proportional sizing. That false positive reinforces the user’s belief that the shortcut works, guaranteeing a failure when the cash flow patterns diverge. Weighting an invalid calculation by net asset value just gives you a more precise invalid calculation.

Migration projects are where this breaks loudest.

The legacy performance system had a bespoke calculation for portfolio returns embedded in a stored procedure that three people understood. The new enterprise data warehouse and BI platform rely on default aggregations. The mapping document specifies that the legacy IRR field maps to the new IRR field. It does not specify the aggregation rule.

During the parallel run, the fund-level numbers match. The total line does not. The reconciliation breaks at the total line because the total line is the only line that requires aggregation. The project plan has no line item for rebuilding the aggregation logic, and the business blames the data. The raw data was audited, the pipeline was monitored, and the extract matched the source system to the decimal. The data was perfectly clean, right up until the pivot table made it a lie.

Pre-calculation is a brute-force solution to a semantic problem.

Another common workaround is pre-calculating every possible permutation of a portfolio hierarchy in the data mart. The head of performance measurement wants every aggregate return ready to prevent users from doing their own math. The data engineer points out that pre-calculating money-weighted returns for every arbitrary grouping of accounts requires millions of daily calculations. Pre-calculating standard hierarchies works for static reporting, but self-service BI requires dynamic calculation at the query layer. Democratizing data access means democratizing the ability to perform invalid math if the underlying architecture does not prevent it.

The practical control is a definition attached to each measure before it enters a summary. The semantic layer must distinguish between fields that can be aggregated on the fly, like market value or accrued interest, and fields that require a call to a calculation engine.

If the measure is derived from a cash flow stream, you need the stream to aggregate it. Model the measure as a calculation over underlying facts, not as a fact itself. Store the cash flows, the positions, and the components. Compute the measure at query time. If the underlying facts are not available in the data warehouse, the measure cannot be aggregated correctly. Do not put it in the values area of a pivot table.

Modern BI tools allow you to disable default aggregations for specific fields. You can force a field to display as a dimension or disable the Sum and Average options, forcing the user to rely on a custom calculation that references the underlying numerators and denominators. The database administrator does not need to know how to calculate a money-weighted return, but the business analyst building the dashboard needs to know that the database is only handing them the final output, not the components required to recalculate it. IT owns the data type, and finance owns the financial type. When neither owns the aggregation logic, the organization gets meaningless numbers.

The dashboard aggregated the column exactly as it was configured to do. The committee then made a capital allocation decision based on a number that referred to nothing.