财务分析报告 - 常用Power BI DAX公式详解
财务分析报告 - 常用Power BI DAX公式详解
摘要
此篇来自对power bi gallery中,上市公司财务分析报告的DAX解析。
我用小龙虾读取了这个报告的公式,让其进行提取,说明,以及关键知识点的说明。
主要用于后续知识的review。
一、时间智能函数
1. 同比分析 (Year-over-Year)
营收同比
营收同比 =
VAR CurrentRevenue = SUM('利润表'[营业收入])
VAR LastYearRevenue = CALCULATE(
SUM('利润表'[营业收入]),
SAMEPERIODLASTYEAR('日期表'[日期])
)
RETURN
DIVIDE(CurrentRevenue - LastYearRevenue, LastYearRevenue)
作用:计算本期营业收入与去年同期的增长百分比
知识点:
SAMEPERIODLASTYEAR():返回去年同期的日期集合CALCULATE():修改计算上下文,是 DAX 最强大的函数DIVIDE():安全除法,避免除零错误
净利润同比
净利润同比 =
VAR CurrentNetProfit = SUM('利润表'[净利润])
VAR LastYearNetProfit = CALCULATE(
SUM('利润表'[净利润]),
SAMEPERIODLASTYEAR('日期表'[日期])
)
RETURN
DIVIDE(CurrentNetProfit - LastYearNetProfit, LastYearNetProfit)
扣非净利润同比
扣非净利润同比 =
VAR CurrentExcluding = SUM('利润表'[扣非净利润])
VAR LastYearExcluding = CALCULATE(
SUM('利润表'[扣非净利润]),
SAMEPERIODLASTYEAR('日期表'[日期])
)
RETURN
DIVIDE(CurrentExcluding - LastYearExcluding, LastYearExcluding)
2. 累计计算 (Running Total)
年初至今营收
年营收 = TOTALYTD(
SUM('利润表'[营业收入]),
'日期表'[日期]
)
知识点:
TOTALYTD():计算年初至今的累计值- 参数可选:年结束月份,如
TOTALYTD(SUM(Sales[Amount]), Dates[Date], "06/30")
年初至今净利润
年净利润 = TOTALYTD(
SUM('利润表'[净利润]),
'日期表'[日期]
)
二、比率计算函数
1. 盈利能力指标
毛利率
毛利率 = DIVIDE(
SUM('利润表'[营业收入]) - SUM('利润表'[营业成本]),
SUM('利润表'[营业收入])
)
等价形式:
毛利率 =
VAR Revenue = SUM('利润表'[营业收入])
VAR COGS = SUM('利润表'[营业成本])
RETURN
1 - DIVIDE(COGS, Revenue)
净利率
净利率 = DIVIDE(
SUM('利润表'[净利润]),
SUM('利润表'[营业收入])
)
净资产收益率 (ROE)
净资产收益率 = DIVIDE(
SUM('利润表'[净利润]),
AVERAGE('资产负债表'[所有者权益])
)
说明:反映股东投资回报率,是杜邦分析的核心指标
总资产收益率 (ROA)
总资产收益率 = DIVIDE(
SUM('利润表'[净利润]),
AVERAGE('资产负债表'[总资产])
)
知识点:
AVERAGE():计算平均值,自动忽略空白- 需使用平均资产,因为资产负债表是时点数据
2. 偿债能力指标
资产负债率
资产负债率 = DIVIDE(
SUM('资产负债表'[负债总额]),
SUM('资产负债表'[资产总额])
)
流动比率
流动比率 = DIVIDE(
SUM('资产负债表'[流动资产]),
SUM('资产负债表'[流动负债])
)
速动比率
速动比率 = DIVIDE(
SUM('资产负债表'[流动资产]) - SUM('资产负债表'[存货]),
SUM('资产负债表'[流动负债])
)
现金流量比率
现金流量比率 = DIVIDE(
SUM('现金流量表'[经营活动产生的现金流量净额]),
SUM('资产负债表'[流动负债])
)
3. 营运能力指标
存货周转率
存货周转率 = DIVIDE(
SUM('利润表'[营业成本]),
AVERAGE('资产负债表'[存货])
)
知识点:周转率越高,说明存货管理效率越好
存货周转天数
存货周转天数 = 365 / [存货周转率]
或使用:
存货周转天数 = DIVIDE(365, [存货周转率])
应收账款周转天数
应收账款周转天数 = DIVIDE(
365 * AVERAGE('资产负债表'[应收账款]),
SUM('利润表'[营业收入])
)
总资产周转率
总资产周转率 = DIVIDE(
SUM('利润表'[营业收入]),
AVERAGE('资产负债表'[总资产])
)
4. 现金流指标
净现比
净现比 = DIVIDE(
SUM('现金流量表'[经营活动产生的现金流量净额]),
SUM('利润表'[净利润])
)
知识点:
- 反映利润的现金质量
- 正常应大于 1,表示利润有真实现金支撑
- 长期小于 1 可能意味着盈利质量不佳
每股经营现金流
每股经营现金流 = DIVIDE(
SUM('现金流量表'[经营活动产生的现金流量净额]),
SUM('公司基本信息'[总股本])
)
三、DAX 核心概念
1. 上下文 (Context)
行上下文 (Row Context)
- 迭代函数(如
SUMX,AVERAGEX)创建行上下文 - 在每一行上计算表达式
Total Cost := SUMX(
Sales,
Sales[Quantity] * Sales[Unit Cost]
)
筛选上下文 (Filter Context)
- 由视觉对象(图表、切片器)创建的过滤条件
CALCULATE()可以修改筛选上下文
Sales Red := CALCULATE(
SUM(Sales[Amount]),
Sales[Color] = "Red"
)
上下文转换
- 行上下文在
CALCULATE内自动转换为筛选上下文 - 这是 DAX 最强大的特性之一
2. 常用迭代函数
| 函数 | 说明 | 示例 |
|---|---|---|
SUMX() |
对表逐行计算后求和 | SUMX(Sales, Sales[Qty] * Sales[Price]) |
AVERAGEX() |
逐行计算后取平均 | AVERAGEX(Sales, Sales[Amount]) |
COUNTX() |
计数非空白值 | COUNTX(Sales, Sales[OrderID]) |
CONCATENATEX() |
串联文本 | CONCATENATEX(Values, Table[Name], ", ") |
MAXX() / MINX() |
最大/最小值 | MAXX(Sales, Sales[Amount]) |
3. 筛选函数
FILTER
HighValueSales := CALCULATE(
SUM(Sales[Amount]),
FILTER(
Sales,
Sales[Amount] > 1000
)
)
ALL
PercentOfTotal := DIVIDE(
SUM(Sales[Amount]),
CALCULATE(SUM(Sales[Amount]), ALL(Sales))
)
作用:移除所有筛选,获取总计
ALLEXCEPT
PercentByCategory := DIVIDE(
SUM(Sales[Amount]),
CALCULATE(SUM(Sales[Amount]), ALLEXCEPT(Sales, Sales[Category]))
)
VALUES / DISTINCT
CategoryCount := COUNTROWS(VALUES(Sales[Category]))
4. 时间智能函数
| 函数 | 功能 |
|---|---|
SAMEPERIODLASTYEAR() |
去年同周期 |
PARALLELPERIOD() |
偏移N个月/季度/年 |
DATEADD() |
日期偏移 |
TOTALYTD() |
年初至今累计 |
TOTALQTD() |
季度至今累计 |
TOTALMTD() |
月初至今累计 |
DATESYTD() |
年初至今日期集 |
ENDOFMONTH() / ENDOFQUARTER() |
月/季度末日期 |
5. 关系函数
RELATED
ProductCategory := RELATED('Product'[Category])
前提:必须存在一对多关系
RELATEDTABLE
SalesCount := COUNTROWS(RELATEDTABLE(Sales))
6. 变量 (VAR)
ComplexMeasure :=
VAR TotalSales = SUM(Sales[Amount])
VAR LastYearSales = CALCULATE(SUM(Sales[Amount]), SAMEPERIODLASTYEAR(Dates[Date]))
VAR YoY = TotalSales - LastYearSales
RETURN
DIVIDE(YoY, LastYearSales)
优点:
- 提高可读性
- 避免重复计算
- 可存储多个中间结果
四、杜邦分析公式
杜邦恒等式
净资产收益率 = 净利率 × 资产周转率 × 权益乘数
权益乘数
权益乘数 = DIVIDE(
SUM('资产负债表'[总资产]),
SUM('资产负债表'[所有者权益])
)
分解后的 ROE
ROE分解 :=
[净利率] * [总资产周转率] * [权益乘数]
五、同行比较公式
行业中位数
行业中位数 = MEDIANX(
ALL('公司数据'),
'公司数据'[市盈率]
)
知识点:
MEDIAN():返回中位数(总体)MEDIANX():返回中位数(迭代)
同行业中值
同行业中值 = CALCULATE(
MEDIAN('公司数据'[市盈率]),
'公司数据'[行业] = SELECTEDVALUE('公司数据'[行业])
)
六、常见错误与最佳实践
1. 常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| 空白结果 | 上下文不匹配 | 使用 CALCULATE 调整 |
| 值过大 | 未正确筛选 | 检查筛选上下文 |
| 时间函数不工作 | 缺少日期表 | 创建连续日期表并标记 |
2. 最佳实践
- 始终创建日期表:
日期表 = CALENDAR(DATE(2020,1,1), TODAY())
- 标记日期表:
MARKASFIRED('日期表')
-
使用度量值而非直接列计算
-
复杂公式使用变量
-
避免在度量值中使用硬编码
七、公式速查表
| 业务指标 | 基础公式 |
|---|---|
| 同比增长率 | (本期-上期) / 上期 |
| 环比增长率 | (本期-上期) / 上期 |
| 毛利率 | (营收-成本) / 营收 |
| 净利率 | 净利润 / 营收 |
| ROE | 净利润 / 净资产 |
| ROA | 净利润 / 总资产 |
| 资产负债率 | 负债 / 资产 |
| 流动比率 | 流动资产 / 流动负债 |
| 周转率 | 成本或收入 / 平均余额 |
| 每股收益 | 净利润 / 股数 |
---------------------------------------------------------------
aspnetx的BI笔记系列索引:
使用SQL Server Analysis Services数据挖掘的关联规则实现商品推荐功能
---------------------------------------------------------------

浙公网安备 33010602011771号