[知识体系] 什么是表函数

  [复制链接]
查看185276 | 回复155 | 2021-2-21 19:02:29 | 显示全部楼层 |阅读模式
本节你会了解 DAX 中标量函数和表函数的区别。表函数是 DAX 内部计算的核心,在编写 DAX 查询而不是度量值或计算列时,表函数非常有用

本文将介绍表函数在 DAX 中的作用, 以及如何在基础场景中使用它们。

表函数介绍

DAX 是一种函数式语言,表达式在计值后得到结果。到目前为止,你已经知晓 DAX 表达式通常返回单个值,例如字符串或数字。我们称这些表达式为标量表达式。当定义度量值计算列时,我们使用的都是标量表达式,如下面的示例所示:
  1. = 4 + 3
  2. = "DAX is a beautiful language"
  3. = SUM ( Sales[Quantity] )
复制代码

但是, 你还可以编写生成表的 DAX 表达式作为结果。我们不能直接将生成表的函数表达式分配给度量值或计算列, 但这不妨碍表函数成为 DAX 的重要组成部分。例如, 有些 DAX 函数允许将返回表的表达式作为其参数,编写 DAX 查询的时候也需要用到这种表表达式。


返回表的表达式的最简单的例子是在 DAX 表达式中引用表名,下面这个表达式返回销售表的全部内容(所有列和所有行):
  1. = Sales
复制代码
度量值只能返回单个值

如果你尝试将返回表的表达式分配给度量值或计算列, 会出现错误:


该表达式引用多列,多列不能转换为标量值


因为度量值只能返回单个值(标量)。你需要进一步操作表表达式以获得一个标量值,使用接受表表达式作为参数的聚合函数可以完成这个任务。例如, 使用 COUNTROWS 函数计算表包含的行数:
  1. = COUNTROWS ( Sales )
复制代码
COUNTROWS 的用法
  1. COUNTROWS ( <table> )
复制代码

COUNTROWS 使用接受表表达式作为参数的 DAX 函数,你可以在参数中直接引用表名,或者引用返回表的函数。


我们根据 DAX 函数的返回类型对其进行分类。我们称返回标量值的函数为“标量函数”,返回表的为“表函数”。例如,COUNTROWS 是一个标量函数,因为它返回一个数值,并接受一个表作为参数。


表函数通常对一个表进行操作,更改原始表的行和/或列。例如,可以使用以下表达式计算单价大于 100 的销售表的行数:
  1. = COUNTROWS (
  2.     FILTER (
  3.         Sales,
  4.         Sales[Unit Price] > 100
  5.     )
  6.   )
复制代码

FILTER 返回一个表,其中只包含单价大于 100 的行。


通常,我们在代码中使用返回表的表达式来迭代表格的行,并聚合一些值,以返回一个标量值作为结果。表表达式不能直接分配给度量值或计算列,但是,你可以在 Power BI Desktop 中通过新建表来使用表表达式,或在 DAX 查询中使用表表达式,以物化(materializing)表表达式的内容。
Excel 目前不支持新建表,你可以使用一种叫做链接回表的方法在 Power Pivot 中新建表

例如, 你可以通过执行下面的表达式来获取单位价格大于 100 的所有销售记录组成的表, 结果如图所示。
  1. = FILTER (
  2.     Sales,
  3.     Sales[Unit Price] > 100
  4. )
复制代码

7113211936391.jpeg

按 Unit_Price 大于 100 筛选出的销售表


DAX 也提供了 EVALUATE 语句,你可以用它来计算返回表的表达式:
  1. EVALUATE
  2. FILTER (
  3.     Sales,
  4.     Sales[Unit Price] > 100
  5. )
复制代码

你可以在任何客户端工具中执行 DAX 查询(Microsoft Excel、Power BI Desktop、DAX Studio、SQL Server Management Studio、Reporting Services 等)。在下一篇文章中,你将看到对 EVALUATE 语法更详细的解释。
回复

举报

yyfreeliang | 2021-4-24 15:51:10 | 显示全部楼层
没人回帖。。。我来个吧
回复

举报

真少爷 | 2021-8-12 22:03:24 | 显示全部楼层
鼎力支持!!
回复

举报

乱熊 | 2021-8-13 15:04:19 | 显示全部楼层
我也顶起出售广告位
回复

举报

suiyuan_5 | 2021-9-3 19:14:50 来自手机 | 显示全部楼层
打酱油的人拉,回复下赚取积分
回复

举报

坏孩子 | 2021-9-7 11:11:09 | 显示全部楼层
佩服佩服!
回复

举报

stockbroker888 | 2021-10-26 15:22:45 | 显示全部楼层
我也是坐沙发的
回复

举报

open168 | 2021-11-17 20:11:25 来自手机 | 显示全部楼层
楼下的接上
回复

举报

wangzhe8054 | 2021-11-17 20:18:21 来自手机 | 显示全部楼层
支持一下云发教育!
回复

举报

carsoom | 2021-11-20 07:18:40 来自手机 | 显示全部楼层
支持支持再支持
回复

举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则