[知识体系] 创建内联表

  [复制链接]
查看111309 | 回复120 | 2021-2-21 19:02:22 | 显示全部楼层 |阅读模式
内联是把函数的源码直接写到调用它的位置,好处是可以消除函数调用时所产生的时间消耗,一般用于需要快速执行的函数
什么是内联

内联(Inline)是编程语言中的一种常见结构,可以节省每次调用函数带来的额外时间开支,在选择使用内联函数时,必须在程序占用空间和程序执行效率之间进行权衡。


7112211936391.png

普通函数 vs 内联函数 图片来源:网络




DAX 中的内联函数

DAX 并非编程语言,内联函数的数量不多,常用的有 DATATABLE 和 Table Constructor ,用法也比较简单。掌握它们可以让你在某些场景下更加灵活的使用 DAX。

DATATABLE

返回以内联方式创建的表,常用于快速创建结构简单的表。
  1. DATATABLE (ColumnName1, DataType1, ColumnName2, DataType2..., {{Value1, Value2...}, {ValueN, ValueN+1...}...})
复制代码

DATATABLE 支持的数据类型有:整数,双精度,字符串,布尔值,货币,日期时间。


DATATABLE 的一个主要限制是表的内容必须是常量,不支持任何 DAX 表达式,所以DATATABLE 不是一个常用的函数。不过这种表构造函数语法为开发人员提供了更灵活的表达能力。


你可以以使用 DATATABLE 来生成简单的常数表。在 SQL Server Data Tools (SSDT)的 Analysis Services 表格中,当开发人员将剪贴板的内容粘贴到模型中时,会生成一个使用 DATATABLE 计算的表,而 Power BI 使用 Power Query 来生成常量表,这是 DATATABLE 在 Power BI 中不常用的另一个原因。
  1. DataTable("Name", STRING,  
  2.                "Region", STRING  
  3.                ,{  
  4.                         {" User1","East"},  
  5.                         {" User2","East"},  
  6.                         {" User3","West"},  
  7.                         {" User4","West"},  
  8.                         {" User4","East"}  
  9.                 }  
  10.            )
复制代码

将以上代码复制到 Power BI Desktop 的新建表,可以看到其结果是一个五行两列的表。


下面的表达式返回一个表,显示了 2019 年季每个度的开始和结束日期。
  1. Quarters2019 =
  2. DATATABLE (
  3.     "Quarter", STRING,
  4.     "StartDate", DATETIME,
  5.     "EndDate", DATETIME,
  6.     {
  7.         { "Q1", "2019-01-01", "2019-03-31" },
  8.         { "Q2", "2019-04-01", "2019-06-30" },
  9.         { "Q3", "2019-07-01", "2019-09-30" },
  10.         { "Q4", "2019-10-01", "2019-12-31" }
  11.     }
  12. )
复制代码

DATATABLE 曾经有一种用法是多值比较,但现在使用 Table Constructor 是更优雅的写法,参考下面三组公式:
  1. EVALUATE
  2. FILTER (
  3.     Customer,
  4.     Customer[CountryRegion] = "Italy"
  5.     || Customer[CountryRegion] = "Greece"
  6.     || Customer[CountryRegion] = "Spain"
  7. )
复制代码
  1. EVALUATE
  2. FILTER (
  3.     Customer,
  4.     CONTAINS (
  5.         DATATABLE (
  6.             "CountryRegion", STRING,
  7.             { { "Italy" }, { "Greece" }, { "Spain" } }
  8.         ),
  9.         [CountryRegion],
  10.         Customer[CountryRegion]
  11.     )
  12. )
复制代码
  1. EVALUATE
  2. FILTER (
  3.     Customer,
  4.     Customer[CountryRegion] IN { "Italy", "Greece", "Spain" }
  5. )
复制代码
Table Constructor

返回一列或多列组成的表,与 DATATABLE 不同的是,表构造器支持使用返回标量的函数表达式
  1. { <scalarExpr1>, <scalarExpr2>, … }  // 一列
  2. { ( <scalarExpr1>, <scalarExpr2>, … ), ( <scalarExpr1>, <scalarExpr2>, … ), … }  // 多列
复制代码

表构造器在代码中直接定义数据类型的方面,当不同行中列值的数据类型不同时,所有值都转换为公共数据类型,下面的查询返回文本类型的列
  1. EVALUATE
  2. { 1, DATE(2017, 1, 1), TRUE, "A" }
复制代码
早期的 DAX 引擎不支持表构造器,你可以在 Power BI 中编译,但无法在 Excel 2016 或更早的版本的中使用它
不具有数据沿袭

表构造器结果是一个沿袭。因此,如果在 CALCULATE 中应用表构造器作为筛选器参数,不会执行任何筛选。

表构造器的妙用


在 DAX STUDIO 中调试模型的时候,不能直接调试度量值,因为 DAX Studio 必须使用返回表的查询。此时你可以使用表构造器将度量值转换为表,从而快速调试度量值。
  1. EVALUATE 
  2. SUMX ( SALES, [SalesAmount] )    // 不支持的写法,查询不能返回标量值

  3. EVALUATE 
  4. {SUMX ( SALES, [SalesAmount] )}  //用大括号包围度量值,可以在编译中通过
复制代码

这种写法需要使用较新的 Tabular model,你可以在 Power BI 中使用这种写法,但不支持 Excel 2016 及更老的版本
回复

使用道具 举报

易水寒 | 2021-4-24 15:48:55 | 显示全部楼层
路过的帮顶
回复

使用道具 举报

lx319 | 2021-7-5 23:19:54 来自手机 | 显示全部楼层
占位编辑
回复

使用道具 举报

枫树 | 2021-7-8 07:22:39 | 显示全部楼层
垃圾内容,路过为证。
回复

使用道具 举报

蝴蝶刀 | 2021-9-4 16:36:40 | 显示全部楼层
忙完了,来看看视频
回复

使用道具 举报

zqm | 2021-9-10 13:35:13 来自手机 | 显示全部楼层
支持,一直很喜欢老师的课程
回复

使用道具 举报

hhm | 2021-9-15 11:27:45 来自手机 | 显示全部楼层
专业抢沙发的!哈哈
回复

使用道具 举报

really | 2021-9-25 12:28:53 | 显示全部楼层
这个不错,学习了
回复

使用道具 举报

Gacia.lopez | 2021-10-24 13:20:32 | 显示全部楼层
太棒了,感谢唐楼主精彩的分享
回复

使用道具 举报

★德仔★ | 2021-10-28 18:37:23 来自手机 | 显示全部楼层
楼下的接上
回复

使用道具 举报

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

本版积分规则