Learning by Doing Series

Financial Ratios Analysis in BI

Topic 23 — Compare Precalculated Ratios vs DAX Ratios. Validate whether DAX-calculated ratios match the ratios previously calculated in Python and SQL.

Topic 23 — Compare Precalculated Ratios vs DAX Ratios

Create comparison measures that compare precalculated ratios from vw_All_Financial_Ratios against DAX-calculated ratios in Power BI.

SQL Server ViewsPower BI ModelDAX MeasuresExecutive Dashboard

Production / Cybersecurity Warning

This exercise uses synthetic training data. Do not connect Power BI to production financial systems, corporate databases, or real accounting data without authorization, sandbox testing, least-privilege access, change-control approval, and cybersecurity compliance.

Objective

Create comparison measures that compare precalculated ratios from vw_All_Financial_Ratios against DAX-calculated ratios in Power BI.

Approach A
Use ratios precalculated in Python and SQL Server.
Approach B
Recalculate selected ratios dynamically in Power BI using DAX.

Business Scenario

A good BI model should be auditable. This topic compares two architectures: ratios calculated before Power BI and ratios calculated dynamically inside Power BI.

OutputPurpose
Precalculated ratio measuresTopic output
DAX ratio measuresTopic output
Variance measuresTopic output
Validation flagsTopic output

Step-by-Step Practice

Step 1 — Connect Power BI to SQL Server

Use Power BI Desktop to connect to Server: JCDCOMPUTER and Database: FinancialRatiosBI.

Power BI Connection
Get Data → SQL Server\nServer: JCDCOMPUTER\nDatabase: FinancialRatiosBI\nMode: Import

Step 2 — Import the Required Tables and Views

Use the SQL views for reporting and the dimension/fact tables when DAX calculations require base financial statement values.

Recommended imports
Dim_Company\nDim_Period\nFact_Income_Statement\nFact_Balance_Sheet\nFact_Cash_Flow\nFact_Debt_Ratios\nvw_All_Financial_Ratios\nvw_Executive_Financial_Summary\nvw_Latest_Period_Ratios

Step 3 — Create or Confirm Relationships

Connect the company and period dimensions to the imported fact tables and views.

Power BI Relationships
Dim_Company[CompanyID] → Fact and View tables[CompanyID]\nDim_Period[PeriodID] → Fact and View tables[PeriodID]

Step 4 — Add the DAX Measures

Create a new measure table named DAX Financial Measures and paste the measures below.

DAX - Final Measures
-- ============================================================
-- Financial Ratios Analysis in BI
-- Topic 23 - Compare Precalculated Ratios vs DAX Ratios
-- ============================================================

-- ------------------------------------------------------------
-- Helper Measures for Precalculated Ratios
-- Source: dbo.vw_All_Financial_Ratios
-- ------------------------------------------------------------

Precalc Current Ratio =
CALCULATE(
    AVERAGE(vw_All_Financial_Ratios[RatioValue]),
    vw_All_Financial_Ratios[RatioName] = "Current Ratio"
)

Precalc Quick Ratio =
CALCULATE(
    AVERAGE(vw_All_Financial_Ratios[RatioValue]),
    vw_All_Financial_Ratios[RatioName] = "Quick Ratio"
)

Precalc Cash Ratio =
CALCULATE(
    AVERAGE(vw_All_Financial_Ratios[RatioValue]),
    vw_All_Financial_Ratios[RatioName] = "Cash Ratio"
)

Precalc Net Profit Margin =
CALCULATE(
    AVERAGE(vw_All_Financial_Ratios[RatioValue]),
    vw_All_Financial_Ratios[RatioName] = "Net Profit Margin"
)

Precalc Return on Assets =
CALCULATE(
    AVERAGE(vw_All_Financial_Ratios[RatioValue]),
    vw_All_Financial_Ratios[RatioName] = "Return on Assets"
)

Precalc Return on Equity =
CALCULATE(
    AVERAGE(vw_All_Financial_Ratios[RatioValue]),
    vw_All_Financial_Ratios[RatioName] = "Return on Equity"
)

Precalc Debt Ratio =
CALCULATE(
    AVERAGE(vw_All_Financial_Ratios[RatioValue]),
    vw_All_Financial_Ratios[RatioName] = "Debt Ratio"
)

Precalc Operating Cash Flow to Sales =
CALCULATE(
    AVERAGE(vw_All_Financial_Ratios[RatioValue]),
    vw_All_Financial_Ratios[RatioName] = "Operating Cash Flow to Sales"
)

-- ------------------------------------------------------------
-- Variance Measures
-- ------------------------------------------------------------

Current Ratio Variance =
[DAX Current Ratio] - [Precalc Current Ratio]

Quick Ratio Variance =
[DAX Quick Ratio] - [Precalc Quick Ratio]

Cash Ratio Variance =
[DAX Cash Ratio] - [Precalc Cash Ratio]

Net Profit Margin Variance =
[DAX Net Profit Margin] - [Precalc Net Profit Margin]

Return on Assets Variance =
[DAX Return on Assets] - [Precalc Return on Assets]

Return on Equity Variance =
[DAX Return on Equity] - [Precalc Return on Equity]

Debt Ratio Variance =
[DAX Debt Ratio] - [Precalc Debt Ratio]

Operating Cash Flow to Sales Variance =
[DAX Operating Cash Flow to Sales] - [Precalc Operating Cash Flow to Sales]

-- ------------------------------------------------------------
-- Absolute Variance Measures
-- ------------------------------------------------------------

Current Ratio Absolute Variance =
ABS([Current Ratio Variance])

Net Profit Margin Absolute Variance =
ABS([Net Profit Margin Variance])

Debt Ratio Absolute Variance =
ABS([Debt Ratio Variance])

-- ------------------------------------------------------------
-- Validation Flags
-- ------------------------------------------------------------

Current Ratio Validation =
IF(
    ABS([Current Ratio Variance]) <= 0.01,
    "Match",
    "Review"
)

Net Profit Margin Validation =
IF(
    ABS([Net Profit Margin Variance]) <= 0.01,
    "Match",
    "Review"
)

Debt Ratio Validation =
IF(
    ABS([Debt Ratio Variance]) <= 0.01,
    "Match",
    "Review"
)

Overall Ratio Validation =
VAR Issues =
    IF([Current Ratio Validation] = "Review", 1, 0)
    + IF([Net Profit Margin Validation] = "Review", 1, 0)
    + IF([Debt Ratio Validation] = "Review", 1, 0)
RETURN
IF(
    Issues = 0,
    "Precalculated and DAX ratios aligned",
    FORMAT(Issues, "0") & " ratio area(s) need review"
)

Step 5 — Validate the Result

Create cards, tables, and trend visuals to confirm that the measures respond to Company, Industry, Fiscal Year, and Quarter slicers.

Expected Output

Expected result
Comparison measures created.
Variance measures available.
Validation flags show Match or Review.

Business Interpretation

This topic turns the model into an audit exercise. Students learn that a BI dashboard should not only display numbers; it should also prove that the numbers make sense.

Final Result of Topic 23

The Power BI model now supports a stronger BI architecture: stored ratios for auditability and dynamic DAX ratios for interactivity.

Next topic: Topic 24 — Build Dynamic Financial Ratio Cards.

Topic 23 — Compare Precalculated Ratios vs DAX Ratios

Crear medidas de comparación entre ratios precalculados desde vw_All_Financial_Ratios y ratios recalculados en DAX dentro de Power BI.

SQL Server ViewsPower BI ModelDAX MeasuresExecutive Dashboard

Advertencia de Producción / Ciberseguridad

Este ejercicio usa data sintética de entrenamiento. No conectes Power BI a sistemas financieros de producción, bases corporativas o data contable real sin autorización, pruebas en sandbox, acceso de mínimo privilegio, aprobación de control de cambios y cumplimiento de ciberseguridad.

Objetivo

Crear medidas de comparación entre ratios precalculados desde vw_All_Financial_Ratios y ratios recalculados en DAX dentro de Power BI.

Approach A
Usar ratios precalculados en Python y SQL Server.
Approach B
Recalcular ratios seleccionados dinámicamente en Power BI usando DAX.

Escenario de Negocio

Un buen modelo BI debe ser auditable. Este tópico compara dos arquitecturas: ratios calculados antes de Power BI y ratios calculados dinámicamente dentro de Power BI.

OutputPurpose
Precalculated ratio measuresTopic output
DAX ratio measuresTopic output
Variance measuresTopic output
Validation flagsTopic output

Práctica Paso a Paso

Paso 1 — Conectar Power BI a SQL Server

Usa Power BI Desktop para conectarte a Server: JCDCOMPUTER y Database: FinancialRatiosBI.

Power BI Connection
Get Data → SQL Server\nServer: JCDCOMPUTER\nDatabase: FinancialRatiosBI\nMode: Import

Paso 2 — Importar Tablas y Views Requeridas

Usa las views SQL para reporting y las tablas de dimensión/fact cuando las medidas DAX necesiten valores base de estados financieros.

Recommended imports
Dim_Company\nDim_Period\nFact_Income_Statement\nFact_Balance_Sheet\nFact_Cash_Flow\nFact_Debt_Ratios\nvw_All_Financial_Ratios\nvw_Executive_Financial_Summary\nvw_Latest_Period_Ratios

Paso 3 — Crear o Confirmar Relaciones

Conecta las dimensiones de compañía y período con las tablas fact y views importadas.

Power BI Relationships
Dim_Company[CompanyID] → Fact and View tables[CompanyID]\nDim_Period[PeriodID] → Fact and View tables[PeriodID]

Paso 4 — Agregar las Medidas DAX

Crea una tabla de medidas llamada DAX Financial Measures y pega las medidas de abajo.

DAX - Final Measures
-- ============================================================
-- Financial Ratios Analysis in BI
-- Topic 23 - Compare Precalculated Ratios vs DAX Ratios
-- ============================================================

-- ------------------------------------------------------------
-- Helper Measures for Precalculated Ratios
-- Source: dbo.vw_All_Financial_Ratios
-- ------------------------------------------------------------

Precalc Current Ratio =
CALCULATE(
    AVERAGE(vw_All_Financial_Ratios[RatioValue]),
    vw_All_Financial_Ratios[RatioName] = "Current Ratio"
)

Precalc Quick Ratio =
CALCULATE(
    AVERAGE(vw_All_Financial_Ratios[RatioValue]),
    vw_All_Financial_Ratios[RatioName] = "Quick Ratio"
)

Precalc Cash Ratio =
CALCULATE(
    AVERAGE(vw_All_Financial_Ratios[RatioValue]),
    vw_All_Financial_Ratios[RatioName] = "Cash Ratio"
)

Precalc Net Profit Margin =
CALCULATE(
    AVERAGE(vw_All_Financial_Ratios[RatioValue]),
    vw_All_Financial_Ratios[RatioName] = "Net Profit Margin"
)

Precalc Return on Assets =
CALCULATE(
    AVERAGE(vw_All_Financial_Ratios[RatioValue]),
    vw_All_Financial_Ratios[RatioName] = "Return on Assets"
)

Precalc Return on Equity =
CALCULATE(
    AVERAGE(vw_All_Financial_Ratios[RatioValue]),
    vw_All_Financial_Ratios[RatioName] = "Return on Equity"
)

Precalc Debt Ratio =
CALCULATE(
    AVERAGE(vw_All_Financial_Ratios[RatioValue]),
    vw_All_Financial_Ratios[RatioName] = "Debt Ratio"
)

Precalc Operating Cash Flow to Sales =
CALCULATE(
    AVERAGE(vw_All_Financial_Ratios[RatioValue]),
    vw_All_Financial_Ratios[RatioName] = "Operating Cash Flow to Sales"
)

-- ------------------------------------------------------------
-- Variance Measures
-- ------------------------------------------------------------

Current Ratio Variance =
[DAX Current Ratio] - [Precalc Current Ratio]

Quick Ratio Variance =
[DAX Quick Ratio] - [Precalc Quick Ratio]

Cash Ratio Variance =
[DAX Cash Ratio] - [Precalc Cash Ratio]

Net Profit Margin Variance =
[DAX Net Profit Margin] - [Precalc Net Profit Margin]

Return on Assets Variance =
[DAX Return on Assets] - [Precalc Return on Assets]

Return on Equity Variance =
[DAX Return on Equity] - [Precalc Return on Equity]

Debt Ratio Variance =
[DAX Debt Ratio] - [Precalc Debt Ratio]

Operating Cash Flow to Sales Variance =
[DAX Operating Cash Flow to Sales] - [Precalc Operating Cash Flow to Sales]

-- ------------------------------------------------------------
-- Absolute Variance Measures
-- ------------------------------------------------------------

Current Ratio Absolute Variance =
ABS([Current Ratio Variance])

Net Profit Margin Absolute Variance =
ABS([Net Profit Margin Variance])

Debt Ratio Absolute Variance =
ABS([Debt Ratio Variance])

-- ------------------------------------------------------------
-- Validation Flags
-- ------------------------------------------------------------

Current Ratio Validation =
IF(
    ABS([Current Ratio Variance]) <= 0.01,
    "Match",
    "Review"
)

Net Profit Margin Validation =
IF(
    ABS([Net Profit Margin Variance]) <= 0.01,
    "Match",
    "Review"
)

Debt Ratio Validation =
IF(
    ABS([Debt Ratio Variance]) <= 0.01,
    "Match",
    "Review"
)

Overall Ratio Validation =
VAR Issues =
    IF([Current Ratio Validation] = "Review", 1, 0)
    + IF([Net Profit Margin Validation] = "Review", 1, 0)
    + IF([Debt Ratio Validation] = "Review", 1, 0)
RETURN
IF(
    Issues = 0,
    "Precalculated and DAX ratios aligned",
    FORMAT(Issues, "0") & " ratio area(s) need review"
)

Paso 5 — Validar el Resultado

Crea cards, tablas y visuales de tendencia para confirmar que las medidas respondan a slicers de Company, Industry, Fiscal Year y Quarter.

Resultado Esperado

Expected result
Comparison measures created.
Variance measures available.
Validation flags show Match or Review.

Interpretación de Negocio

Este tópico convierte el modelo en un ejercicio de auditoría. Los estudiantes aprenden que un dashboard BI no solo debe mostrar números; también debe probar que los números hacen sentido.

Resultado Final del Topic 23

El modelo Power BI ahora soporta una arquitectura BI más fuerte: ratios almacenados para auditabilidad y ratios dinámicos DAX para interactividad.

Próximo tópico: Topic 24 — Build Dynamic Financial Ratio Cards.