如何用Power BI DAX公式进行财务分析报告详解?

摘要:此篇来自对power bi gallery中,上市公司财务分析报告的DAX解析。
我用小龙虾读取了这个报告的公式,让其进行提取,说明,以及关键知识点的说明。
主要用于后续知识的review。
财务分析报告 - 常用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 净利润 / 总资产 资产负债率 负债 / 资产 流动比率 流动资产 / 流动负债 周转率 成本或收入 / 平均余额 每股收益 净利润 / 股数