afv-library/skills/tableau-next-semantic-model-generate/references/kpi-formulas.md
Antoine Laviron b26d254871 feat: add tableau-next-semantic-model-generate skill
Adds a skill for authoring Tableau Next semantic models (SDMs) on Data 360: build from scratch, add data objects, define joins, enrich with calculated fields and metrics, and make models AI-ready.

Smoke-tested against a live Data 360 org: SDM discovery, AI-readiness flip, dimension creation, metric creation, and description backfill all exercised end-to-end.
2026-07-26 13:33:29 +02:00

23 KiB
Raw Blame History

KPI Formulas & Aggregation Patterns

Business-logic reference for building calculated fields (_clc) and metrics (_mtc) on a Tableau Next semantic model. Provides lookup tables for custom aggregations, composite KPI formulas, and color semantics observed across finance, banking, sales, HR, retail, marketing, procurement, supply-chain, travel, and executive dashboards.


Table of Contents


Time-Based Aggregation Patterns

Native Tableau formulas for time-based business calculations. Replace [Date], [Measure], [Dimension] placeholders with actual field names from your semantic model.

Snapshot & Position Aggregations

Pattern Tableau Formula Business Use Case
Sum of (last period only) SUM(IF [Date] = { INCLUDE : MAX([Date]) } THEN [Measure] ELSE NULL END) Balance sheets, headcount snapshots, portfolio positions, inventory levels
Sum of (first period only) SUM(IF [Date] = { INCLUDE : MIN([Date]) } THEN [Measure] ELSE NULL END) Initial investment positions, opening balances
Average of (last period only) AVG(IF [Date] = { INCLUDE : MAX([Date]) } THEN [Measure] ELSE NULL END) Staff demographics at period end, current average values
Median of (last period only) MEDIAN(IF [Date] = { INCLUDE : MAX([Date]) } THEN [Measure] ELSE NULL END) Central tendency for period-end snapshots
Count Distinct of (last period only) COUNTD(IF [Date] = { INCLUDE : MAX([Date]) } THEN [Dimension] ELSE NULL END) Ending counts of unique items (Active Customers EOP, Open Positions)

When to use: For metrics that represent a state at a specific point in time rather than cumulative totals. Q1 value = last known value in Q1.

Time-Scaled Aggregations

Pattern Tableau Formula Business Use Case
Sum of (annualized) SUM([Measure]) * (12 / COUNTD(DATEPART('month', [Date]))) Revenue projections; 1 month × 12, 2 months × 6, 3 months × 4
Sum of (monthly average) SUM([Measure]) / COUNTD(DATEPART('year', [Date]) + DATEPART('month', [Date])) Avg Monthly Inventory, Avg Monthly Assets

Annualization logic: Extrapolate partial-period values to full year.

Period Range Aggregations

Pattern Tableau Formula Business Use Case
Sum of (from to) SUM(IF [Date] >= [FromDate] AND [Date] <= [ToDate] THEN [Measure] END) Total Sales During Contract, Revenue in Date Range
Average of (from to) AVG(IF [Date] >= [FromDate] AND [Date] <= [ToDate] THEN [Measure] END) Avg Deal Size During Q1-Q3
Min/Max/Median (from to) Same pattern with MIN, MAX, MEDIAN Lowest inventory, peak revenue, median ticket
Count Distinct (from to) COUNTD(IF [Date] >= [FromDate] AND [Date] <= [ToDate] THEN [Dimension] END) Unique Customers Between Launch-EOY

When to use: For metrics that need to aggregate data only within a specific date range.

Lifecycle & Cohort Aggregations

Pattern Tableau Formula Business Use Case
Count Distinct of New COUNTD(IF [Date] = { FIXED [Dimension] : MIN([Date]) } THEN [Dimension] END) New Customers, New Products, New Hires
Count Distinct of Ending COUNTD(IF [Date] = { FIXED [Dimension] : MAX([Date]) } THEN [Dimension] END) Lost Customers, Discontinued Products
Sum of (for New) SUM(IF [Date] = { FIXED [Dimension] : MIN([Date]) } THEN [Measure] END) Revenue from New Customers only
Avg Lifetime of DATEDIFF('day', { FIXED [Dimension] : MIN([Date]) }, { INCLUDE [Dimension] : MAX([Date]) }) / 365 Customer tenure (years), Product lifetime, Employee tenure

When to use: For cohort analysis, churn tracking, and new/lost item identification.

Time Interval Calculations

Pattern Tableau Formula Business Use Case
Avg Years between DATEDIFF('day', [StartDate], [EndDate]) / 365 Avg Years to Maturity, Avg Investment Horizon
Avg Months between DATEDIFF('day', [StartDate], [EndDate]) / 365 * 12 Avg Months to Close, Loan Duration
Avg Days between DATEDIFF('minute', [StartDate], [EndDate]) / (24 * 60) Days to Close, Days Between Booking-Travel
Avg Hours between DATEDIFF('minute', [StartDate], [EndDate]) / 60 Avg Response Time
Avg Minutes between DATEDIFF('minute', [StartDate], [EndDate]) Avg Call Duration
Avg Seconds between DATEDIFF('second', [StartDate], [EndDate]) Avg Page Load Time

Composite KPI Patterns

Real-world KPI formulas from production dashboards (finance, banking, sales).

Financial Statement Patterns

Income Statement (Profit & Loss)

Pattern Formula Example
Gross Profit Revenues - Cost of Revenues KPI1 - KPI2 where KPI1=Total Revenues, KPI2=COGS
Gross Margin % Gross Profit / Revenues (Revenues - COGS) / Revenues
Operating Income Gross Profit - (OpEx + Depreciation) KPI2 - (KPI4 + KPI12)
Operating Income % Operating Income / Revenues Operating Income / Total Revenues
Net Income Operating Income - (Interests + Taxes) KPI13 - KPI15

Tableau Implementation:

<kpi-simple name='KPI1' aggregation='SUM' canonical-attribute='IF STARTSWITH(UPPER(Dim2),"REVENUES") THEN Value END' />
<kpi-simple name='KPI11' aggregation='SUM' canonical-attribute='IF STARTSWITH(UPPER(Dim2),"COST OF REVENUES") THEN Value END' />
<kpi-composite name='KPI2' caption='Gross Profit' kpi1-name='KPI1' calculation='-' kpi2-name='KPI11' />

Balance Sheet

Pattern Formula Example
Working Capital Current Assets - Current Liabilities KPI17 - KPI18 using snapshot aggregation
Total Assets Current Assets + Non-Current Assets Sum all asset categories with snapshot aggregation
Total Equity Total Assets - Total Liabilities KPI21 - KPI22
Current Ratio Current Assets / Current Liabilities KPI17 / KPI18
Quick Ratio (Cash + AR) / Current Liabilities KPI24 / KPI18
Debt to Equity Total Liabilities / Total Equity KPI22 / KPI7

Critical: Use snapshot aggregation (SUM(IF [Date] = MAX([Date]) THEN ... END)) for balance sheet accounts.

Banking & Wealth Management Patterns

Assets under Management (AuM)

Pattern Formula Business Meaning
Net New Money (NNM) Inflows - Outflows zn(Inflows) + zn(Outflows) (Outflows are negative)
AuM Balance Last period AuM (snapshot) Use snapshot aggregation: SUM(IF [Date] = { INCLUDE : MAX([Date]) } THEN [AuM] END)
AuM per Client Total AuM / Nb of Clients KPI3 / KPI6
Return on Assets % Annualized Income / Avg Monthly AuM SUM(Income)*12/COUNTD(Month) / (SUM(AuM)/COUNTD(Month))
New Clients Count new occurrences COUNTD(IF [Date] = { FIXED [Client] : MIN([Date]) } THEN [Client] END)
Lost Clients Count ending occurrences COUNTD(IF [Date] = { FIXED [Client] : MAX([Date]) } THEN [Client] END)
Client Asset & Liabilities (CAL) AuM + Lending Stock KPI3 + KPI17
Net New Lending (NNL) Lending Inflows + Lending Outflows KPI21 + KPI23

Lending & Loans

Pattern Formula Business Meaning
Total Revenue Interests + Fees KPI2 + KPI4 (monthly totals)
Revenue Rate % (Interests + Fees) / Loan Amortization KPI11 / KPI3
Delinquent Loans Rate % Delinquent Count / Total Active Loans KPI14 / KPI5
Default Rate % Defaulted Count / Total Active Loans KPI15 / KPI5
Client Liabilities (EOP) Outstanding balance at period end SUM(IF [Date] = { INCLUDE : MAX([Date]) } THEN [ClientLiabilities] END)

Sales & Travel Patterns

Pattern Formula Example
Average Spend per Customer Total Amount / Count Distinct Customers KPI1 / KPI7
Share of Metric AVG(IF condition THEN 1 ELSE 0 END) AVG(if upper(Dim11)="Y" then 1 else 0 end) for "% Online"
Over-pricing % (Actual - Lowest) / Lowest (TicketAmount - LowestFare) / LowestFare
Days Between Events DATEDIFF('minute', [Date1], [Date2]) / (24 * 60) Days between booking and travel
Tickets per Traveler Total Tickets / Distinct Travelers KPI5 / KPI7

Supply Chain Patterns

Pattern Formula Business Meaning
Product Demand Index Integer scale 1-5 (Low to High) Direct measure, no calculation
Logistics Reliability Integer scale 1-5 Direct measure, use MEDIAN or AVG
Inflation Impact Integer scale 1-5 Direct measure for risk scoring

Usage Notes

Aggregation Selection Criteria

  1. Snapshot metrics (balance sheet, headcount, inventory): Use SUM(IF [Date] = MAX([Date]) THEN ... END)
  2. Flow metrics (revenue, expenses, transactions): Use standard SUM, AVG, COUNT
  3. New/lost tracking: Use COUNTD(IF [Date] = { FIXED [Dim] : MIN/MAX([Date]) } THEN [Dim] END)
  4. Time-between calculations: Use DATEDIFF('day', [Start], [End]) with appropriate unit
  5. Annualized projections: Use SUM([Measure]) * (12 / COUNTD(Month))
  6. Period-constrained aggregations: Use SUM(IF [Date] >= [From] AND [Date] <= [To] THEN ... END)

Cross-References


Metric Clarifications

Before implementing a KPI, determine which variant matches the business question. Many pattern names suggest lifetime or strategic metrics, but the formula may be period-specific.

Period vs Lifetime Metrics

Type When to Use Formula Pattern Example
Period "Revenue per customer this month" SUM(Measure) / COUNTD(Dimension) Total Sales / Active Customers
Lifetime "Total value of a customer over their entire relationship" { FIXED [Dimension]: SUM(Measure) } { FIXED [Customer]: SUM([Revenue]) }

Rule: If the metric name includes "Lifetime," "LTV," "CLV," or "Total Value," use an LOD expression to aggregate at the entity level first, then average or sum as needed.

Simple vs Fully-Loaded Costs

Type When to Use Example
Simple Quick operational view CAC = Marketing Spend / New Customers
Fully-Loaded Strategic investment decisions CAC = (Marketing + Sales salaries + Overhead + Tools) / New Customers

Rule: Document which cost components are included. "CAC" without qualification typically means marketing-only; "fully-loaded CAC" includes sales and overhead.

Snapshot vs Flow Metrics

Type When to Use Aggregation Example
Snapshot State at a point in time SUM(IF [Date] = MAX([Date]) THEN ... END) MRR, Headcount (EOP), Inventory
Flow Activity over a period SUM, COUNT Revenue, Orders, New Customers

Rule: Use snapshot aggregation for balance-sheet style metrics; use SUM/COUNT for income-statement style metrics.

Attribution Models

For marketing metrics (ROAS, CPA, Conversion Rate), clarify:

  • Total: All revenue in period ÷ ad spend (simple, may over-attribute)
  • Attributed: Revenue/conversions filtered to ad-sourced customers only (requires attribution dimension)

Industry-Specific KPI Patterns

Business formulas extracted from 61 production dashboard templates across multiple industries.

Sales & E-Commerce

Customer Lifetime Value (CLV) Patterns

Real CLV answers: "How much total revenue will this customer generate over their entire relationship?" Use these patterns when the user asks for CLV, LTV, or Customer Lifetime Value.

Pattern Formula Business Use Case
CLV per Customer { FIXED [Customer]: SUM([Revenue]) } Total revenue per customer over entire history
Average CLV AVG([CLV per Customer]) Portfolio average lifetime value
Predictive CLV AOV × Purchase Frequency × Customer Lifespan Forward-looking estimate; use DATEDIFF('day', { FIXED [Customer] : MIN([Date]) }, { INCLUDE [Customer] : MAX([Date]) }) / 365 for lifespan
Cohort CLV SUM([CLV per Customer]) where Customer in cohort Total value of a cohort

When to use each: CLV per Customer is the base calc field; Average CLV for KPI cards; Predictive CLV when you need forward-looking estimates without full history.

Period Metrics (not lifetime):

Pattern Formula Business Use Case
Sales per Customer Total Sales / Active Customers KPI1 / KPI2 - Average customer spend in period; for lifetime value, see CLV patterns above
New Customers COUNTD(IF [Date] = { FIXED [Customer] : MIN([Date]) } THEN [Customer] END) Count first-time customers in period
Sales Margin % Total Margin / Total Sales KPI4 / KPI1 - Profitability percentage
Sales Costs % (Sales - Margin) / Sales KPI9 / KPI1 - Cost ratio
Average Selling Price Total Sales / Total Quantity KPI1 / KPI5 - Price per unit
Gross Discount % (Volume at List Price - Sales Incl VAT) / Volume at List Price Discount effectiveness
Net Discount % (Volume at List Price - Sales Excl VAT) / Volume at List Price After-tax discount
VAT Amount Sales Incl VAT - Sales Excl VAT Tax calculation

E-Commerce Specific:

Pattern Formula Business Use Case
Customer Acquisition Cost (CAC) Marketing Costs / New Customers SUM(IF [Date] = { FIXED [Customer] : MIN([Date]) } THEN [MarketingCosts] END) / COUNTD(IF [Date] = { FIXED [Customer] : MIN([Date]) } THEN [Customer] END)
CLV/CAC Ratio Average CLV / CAC Profitability of acquisition; CLV = { FIXED [Customer]: SUM([Revenue]) } averaged (see CLV patterns above)
Conversion Rate Orders / Visits Visitor-to-customer conversion
Average Order Value (AOV) Total Revenue / Number of Orders Revenue per transaction
Cart Abandonment % (Carts Created - Orders) / Carts Created Lost sales opportunity

Recurring Revenue (SaaS/Subscription)

Pattern Formula Business Use Case
MRR (Monthly Recurring Revenue) SUM(IF [Date] = { INCLUDE : MAX([Date]) } THEN [MonthlyRecurringRevenue] END) Snapshot at period end
ARR (Annual Recurring Revenue) SUM(IF [Date] = { INCLUDE : MAX([Date]) } THEN 12 * [MonthlyRecurringRevenue] END) Annualized recurring revenue
Total Revenue SUM(ZN(OneTimeFee) + ZN(MonthlyRecurringRevenue)) Recurring + one-time fees
Recurring Revenue % Period Recurring Revenue / Total Revenue KPI5 / KPI1 - Subscription mix
Contract Duration (months) DATEDIFF('day', [StartDate], [EndDate]) / 365 * 12 Average contract length
Revenue per Account Total Revenue / Active Accounts KPI1 / KPI2 - Period metric; for account lifetime value, use { FIXED [Account]: SUM([Revenue]) }
New Active Accounts COUNTD(IF [Date] = { FIXED [Account] : MIN([Date]) } THEN [Account] END) First-time contracts

Key Insight: Use snapshot aggregation for MRR/ARR (last period value), not SUM.

Retail & Inventory

Pattern Formula Business Use Case
Sales per Store Total Sales / Active Stores KPI1 / KPI7 - Store productivity
Distinct Products Sold COUNTD(Product) Catalog depth
Average Inventory Value SUM(On-Hand Amount) / COUNTD(Date) Average inventory holding
Total On-Hand Inventory SUM(IF [Date] = { INCLUDE : MAX([Date]) } THEN [OnHandAmount] END) Snapshot inventory value
Inventory Turnover (Days in Year × Total Sales) / Total On-Hand Inventory (DAYSinYEAR * KPI1) / KPI101 - Turns per year; higher = faster sell-through
Days Sales of Inventory (DSI) Total On-Hand Inventory / (Total Sales / 365) Days to sell current inventory; use Inventory / Daily Sales for correct time dimension
Average Selling Price Total Sales / Total Sales Units KPI1 / KPI50 - Price per unit
Out-of-Stock Positions SUM(IF On-Hand Units = 0 THEN 1 END) Count of stockouts
Out-of-Stocks % Out-of-Stock Positions / Inventory Positions KPI13 / KPI14 - Stockout rate

Procurement & Supply Chain

Pattern Formula Business Use Case
Spend per Vendor Total Spend / Active Vendors KPI1 / KPI2 - Vendor concentration
New Vendor # COUNTD(IF [Date] = { FIXED [Vendor] : MIN([Date]) } THEN [Vendor] END) First-time suppliers
Average Buying Price Purchasing Volume / Total Purchase Quantity KPI1 / KPI5 - Unit cost
Spend Under Management (SuM) SUM(IF [Date] >= [StartDate] AND [Date] <= [EndDate] THEN [Amount] END) Contracted spend in period
Ongoing Contracts COUNTD(IF [Date] >= [StartDate] AND [Date] <= [EndDate] THEN [Contract] END) Active contracts during period
Active Suppliers COUNTD(IF [Date] >= [StartDate] AND [Date] <= [EndDate] THEN [Supplier] END) Suppliers with active contracts
Avg Contract Size Spend Under Management / Ongoing Contracts KPI1 / KPI2 - Contract value

Digital Marketing & Advertising

Google Analytics:

Pattern Formula Business Use Case
Bounce Rate % Bounced Sessions / Total Sessions Single-page visits
Pages per Session Total Pageviews / Total Sessions Engagement depth
Avg Session Duration DATEDIFF('second', [SessionStart], [SessionEnd]) Time on site
Conversion Rate % Goal Completions / Total Sessions Success rate
Cost per Click (CPC) Total Ad Spend / Total Clicks Click efficiency
Click-Through Rate (CTR) % Clicks / Impressions Ad engagement

Google/Facebook/Twitter Ads:

Pattern Formula Business Use Case
Cost per Acquisition (CPA) Total Spend / Conversions KPI1 / KPI3 - Conversion cost
Return on Ad Spend (ROAS) Revenue / Ad Spend KPI4 / KPI1 - Total period revenue ÷ ad spend; for attributed ROAS, filter revenue to ad-sourced conversions
CPM (Cost per 1000 Impressions) (Total Spend / Impressions) × 1000 Reach cost
Conversion Rate % Conversions / Clicks Click-to-conversion rate
Quality Score (CTR × Relevance × Landing Page Experience) Ad platform ranking
Cost per Lead (CPL) Total Spend / Leads Generated Lead acquisition cost

Email Marketing:

Pattern Formula Business Use Case
Open Rate % Emails Opened / Emails Delivered Email engagement
Click Rate % Clicks / Emails Delivered Link engagement
Click-to-Open Rate (CTOR) % Clicks / Opens Engaged reader action
Unsubscribe Rate % Unsubscribes / Emails Delivered List health
Bounce Rate % Bounced Emails / Total Emails Sent Deliverability
Conversion Rate % Conversions / Emails Delivered Campaign effectiveness

Sales Performance & Quotas

Pattern Formula Business Use Case
Sales vs Quota Total Sales - Total Quota KPI1 - KPI2 - Variance amount
Quota Attainment % Total Sales / Total Quota KPI1 / KPI2 - Achievement rate
Market Share % Our Sales / Total Market Size KPI2 / KPI1 - Competitive position

RFM Analysis (Customer Segmentation)

Recency, Frequency, Monetary analysis - Template focuses on segmentation visualizations rather than formulas. Primary KPIs:

  • Total Sales: SUM(SalesAmount)
  • Active Customers #: COUNTD(Customer)

Segmentation happens in visualization layer using FIXED LOD calculations on last purchase date, purchase count, and average spend.


Advanced Aggregation Use Cases by Industry

Finance: Balance Sheet Accounts

  • Use: Snapshot aggregation for all asset/liability accounts
  • Why: Balance sheets are snapshots at period end, not cumulative totals
  • Formula: SUM(IF [Date] = { INCLUDE : MAX([Date]) } THEN [Measure] END)

Banking: Portfolio Positions

  • Use: Snapshot aggregation for AuM, Lending Stock
  • Why: Account balances are point-in-time values
  • Pattern: COUNTD(IF [Date] = { FIXED [Client] : MIN/MAX([Date]) } THEN [Client] END) for client churn

Sales: New/Lost Customer Tracking

  • Use: COUNTD(IF [Date] = { FIXED [Customer] : MIN([Date]) } THEN [Customer] END) for new customers
  • Why: First transaction ever per customer
  • Pattern: New Customers = first transaction in period

Retail: Inventory Management

  • Use: Snapshot aggregation for on-hand inventory, SUM for sales
  • Why: Inventory is snapshot; sales are cumulative
  • Pattern: Inventory Turnover = (Annual Sales) / (Average Inventory)

Recurring Revenue: MRR/ARR

  • Use: Snapshot aggregation for MRR (not SUM!)
  • Why: MRR is the recurring revenue at period end, not summed across days
  • Formula: SUM(IF [Date] = { INCLUDE : MAX([Date]) } THEN [MonthlyRecurringRevenue] END)

Procurement: Contract Duration

  • Use: SUM(IF [Date] >= [From] AND [Date] <= [To] THEN [Amount] END) for active contracts
  • Why: Only count/sum contracts active between start/end dates
  • Pattern: Spend Under Management = contracts overlapping the analysis period

Digital Marketing: Time-Based Metrics

  • Use: DATEDIFF('second', [Start], [End]) for session duration, response time
  • Why: Native time difference calculations
  • Pattern: Avg Session Duration = DATEDIFF('second', [SessionStart], [SessionEnd])

Coverage: 61 production dashboard templates across Finance (P&L, Balance Sheet, Cash Flow), Banking (AuM, Lending, Loans), Sales (Basic, Expert, Margin, Discount/VAT, RFM, Market Share), Recurring Revenue (SaaS/Subscription), Retail (Sales, Inventory), E-Commerce, Digital Marketing (Google Analytics, Google Ads, Facebook Ads, Twitter Ads, Email Marketing), Procurement (Spend Analytics, Purchasing, Contracts), Supply Chain, Travel, and CEO Cockpits.