美文网首页
2.1 理解DAX计算

2.1 理解DAX计算

作者: jweishan | 来源:发表于2020-02-25 11:19 被阅读0次

    第2章 DAX简介

    2.1 理解DAX计算
    2.2了解计算列和度量值
    2.3 变量入门
    2.4 DAX表达式中的错误处理
    2.5 格式化DAX代码
    2.6 聚合函数和迭代函数
    2.7 使用常见的DAX函数

    在本章中,我们开始讨论DAX语言。在这里,您将学习该语言的语法,计算列与度量值之间的差异(在某些旧的Excel版本中也称为计算字段)以及DAX中最常用的函数。

    因为这是介绍性的一章,所以它没有深入介绍许多功能。后面的章节中将更详细地讲解。现在了解功能并开始着眼于DAX语言就够了。当我们在Power BI,Power Pivot或Analysis Services中涉及数据模型的功能时,即使产品中没有该功能,我们也会使用术语Tabular(表格模型)。例如,"Tabular in DirectQuery"是指Power BI和Analysis Services中可用的DirectQuery模式但Excel中没有。

    理解DAX计算

    在研究更复杂的公式之前,需要学习DAX的基础知识,包括DAX语法、DAX可以处理的不同数据类型、基本运算符以及如何引用列和表,接下来的几节中将讨论这些概念。

    我们使用DAX计算表中的列值,聚合、计算和搜索数据,所有计算最终都涉及表和列。因此首先要学习的语法是如何引用表中的列。

    引用列的通用格式是将表名写在单引号中,然后将列名写在方括号中,如下所示:
    Sales'[Quantity]

    如果表名不以数字开头、不包含空格并且不是保留字(例如DateSum),则可以省略单引号。

    如果在某个表中定义公式时引用该表中的列或度量值,则表名也省略。因此,[Quantity]如果写在Sales表中的计算列或度量值中是有效的列引用。尽管如此,但我们强烈建议您不要省略表名。对此我们现在不去解释它的意义所在,当您阅读第5章 " 了解CALCULATE 和CALCULATETABLE " 时,原因就显而易见。 当您阅读DAX代码时,能够区分度量值(稍后讨论)和列至关重要。实际标准是始终在列引用中使用表名,而在度量值引用中避免使用表名。您越早采用此标准,DAX用起来就越轻松。因此,应该尽快习惯这种引用列和度量值的方式:

     Sales[Quantity]    * 2 --这是一个列引用
     [Sales Amount]     * 2 --这是一个度量值引用
    

    DAX中的注释
    上次代码示例中首次出现了DAX中的注释。DAX支持单行注释和多行注释。单行注释以-或//开头,紧接着的该行的其余内容被视为注释。

    = Sales[Quantity] * Sales[Net Price]     -- Single-line comment
    = Sales[Quantity] * Sales[Unit Cost]     // Another example of single-line comment
    

    最好避免在DAX度量值、计算列或计算表的表达式末尾添加注释。这些注释起初可能不可见,并且DAX 格式化器等工具可能不支持,本章稍后将对此进行讨论。
    在学习了上下文转换(第5章)后,您将了解该标准的基本原理。现在,请相信我们并遵守该标准。

    DAX数据类型

    DAX可以处理七个不同的数字类型,随着时间的流逝,Microsoft在不同时期为相同的数据类型引入了不同的名称,造成了混乱。

    表2-1中可以找到DAX各种数据类型的不同名称。

    本书中,秉承数据库和商业智能社区事实上的标准,我们使用表格2- 1第一列中的名称。例如,在Power BI中,包含TRUEFALSE的列将称为TRUE / FALSE,而在SQL Server中,将其称为BIT。但是,这种类型的值的历史上最常用的名称是Boolean

    表2-1 数据类型

    DAX POWER BI Power Pivot和Analysis Services 对应的常规数据类型(如SQL Server) 表格对象模型(TOM)
    Integer Whole Number Whole Number Integer/INT Int64
    Decimal Decimal Number Decimal Number Floating point/DOUBLE double
    Currency Fixed Decimal Number Currency Currency/MONNEY Decimai
    DateTime DateTime, Date,Time Date Date/DATETIME dateTime
    Bolean True/False True/False Boolean/BTT/ boolean
    String Text Text String/NVARCHAR (MAX) string
    Variant variant
    Binary Binary Binary Blob/VARBINARY (MAX) binary

    DAX具有强大的类型处理系统,因此我们不必担心数据类型。在DAX表达式中,计算结果数据类型取决于表达式中使用的术语。如果从DAX表达式返回的数据类型不是预期的数据类型,则必须注意,调查表达式本身中使用的术语将导致的数据类型。

    例如,如果求和数据中的一项是日期,则结果也是日期;同理,如果对整数求和,则结果为整数。此行为称为运算符重载,图2-1中显示了一个示例,其中OrderDatePlusOneWeekOrder Date列的值上加7,计算结果是一个日期。
    Sales[OrderDatePlusOneWeek] = Sales[Order Date] + 7

    图2-1 向日期添加整数会导致日期增加相应的天数

    除了运算符重载之外,DAX还会在运算符需要时,自动将字符串转换为数字,将数字转换为字符串。例如,如果我们使用""运算符来连接字符串,则DAX会将其参数转换为字符串。

    以下公式以字符串形式返回" 54":
    = 5&4

    然而下一公式返回结果为整数9:
    = "5" + "4"

    计算结果值取决于运算符,而不取决于源列,源列将根据运算符的要求进行转换。尽管此行为貌似很方便,但在本章后面的内容中,您会看到在这些自动转换过程中可能发生的错误。此外,并非所有操作符都遵循此行为。例如,比较运算符不能将字符串与数字进行比较。因此,您可以将一个数字与字符串相加,但是不能将数字与字符串进行比较。你可以在这里找到一个完整的参考:
    https://docs.microsoft.com/en-us/power-BI/desktop-data-types
    https://docs.microsoft.com/en-us/power-bi/desktop-data-types

    由于规则是如此复杂,因此建议您完全避免自动转换。如果需要进行转换,建议您控制它并使转换明确。为了更明确,前面的示例应如下所示:
    = VALUE(" 5")+ VALUE(" 4")

    习惯使用Excel或其他语言的人可能熟悉DAX数据类型。对数据类型的详细规定取决于引擎,并且对于Power BI,Power Pivot或Analysis Services,它们可能有所不同。您可以在以下网址找到有关Analysis Services DAX数据类型的更多详细信息:有关数据类型的注意事项非常有用。
    http://msdn.microsoft.com/en-us/library/gg492146.aspx
    在以下网址找到Power BI信息:
    https://docs.microsoft.com/zh-cn/power-bi/desktop-data-types

    Integer

    DAX仅具有一种Integer数据类型(整数)可以存储64位值。DAX中整数值之间的所有内部计算也使用64位值。

    Decimal

    Decimal(十进制数)总是存储为双精度浮点值。请勿将此DAX数据类型与Transact-SQLdecimal and numeric数据类型混淆。SQL中DAX 的Decimal对应数据类型为Float

    Currency

    Currency(货币)数据类型存储固定十进制数,在Power BI中也被称为Fixed Decimal Number(固定十进制数)。它可以代表四位小数,内部存储为64位整数值除以10,000。对Currency数据类型进行加减法运算会忽略小数点后第四位的小数,而乘除法则产生一个浮点值,从而提高了计算结果的精度。通常,如果需要提供高于四位数的精度,则必须使用Decimal数据类型。
    Currency数据类型的默认格式包括货币符号。我们还可以将货币格式应用于整数和十进制数,并且可以对Currency数据类型使用不带货币符号的格式。

    DateTime

    DAX将日期存储为DateTime类型。此格式在内部使用浮点数,其中整数部分对应于1899年12月30日以来的天数,多出的小时、分钟和秒转换为小数部分。因此,以下表达式返回当前日期加上一天(恰好是24小时):
    = TODAY()+ 1
    计算结果是明天的日期。如果只需要使用DateTime的日期部分,请记住使用TRUNC除去小数部分。
    Power BI提供了另外两种数据类型:DateTime。在内部,它们是DateTime的简单变体。实际上,DateTime分别存储DateTime的整数或小数部分。

    Boolean

    Boolean数据类型(布尔)用于表示逻辑条件。例如,以下表达式定义的计算列为布尔型:
    = Sales[Unit Price] > Sales[Unit Cost]
    您还会看到布尔型为数字,其中TRUE等于1,而FALSE等于0。由于TRUE > FALSE,这种表示法被证明有时对排序有利。
    DAX中的每个字符串都存储为Unicode字符串,其中每个字符都以16位存储。默认情况下,字符串之间的比较不区分大小写,因此两个字符串" Power BI"和" POWER BI"被视为相等。

    Variant

    Variant数据类型(变体)用于根据不同的条件,返回不同的数据类型。例如,以下语句既可能返回整数又可能返回字符串,因此设置为变体类型:
    IF([measure]> 0,1,"N/A")
    变体数据类型不能用于常规表中列的数据类型。通常DAX度量值表达式可以是Variant

    Binary

    Binary(二进制)数据类型在数据模型中用来存储图像或其它非结构化信息使用。它在DAX中不可用。主要是Power View使用它,在Power BI等其他工具中可能不可用。

    DAX运算符

    既然您已经了解了运算符在确定表达式类型中的重要性,现在来看表2-2列出的DAX中可用的运算符。

    表2-2 运算符

    运算符类型 符号 使用 示例
    括号 () 优先顺序和参数分组 (5+2)*3
    算术 + 4+2
    算术 - 减/负 5-3
    算术 * 4*2
    算术 / 4/2
    比较 = 等于 [CountryRegion] = “USA”
    比较 <> 不等于 [CountryRegion] <>“USA”
    比较 > 大于 [Quantity] > 0
    比较 >= 大于等于 [Quantity] >= 100
    比较 < 小于 [Quantity] < 0
    比较 <= 小于等于 [Quantity] <= 100
    文本 & 字符串连接 “Value is” & [Amount]
    逻辑 && 逻辑与 [CountryRegion] = “USA”
    逻辑 逻辑或 [CountryRegion] = “USA”
    逻辑 IN 列表中是否包含元素 [CountryRegion] IN {“USA”, “Canada”}
    逻辑 NOT 逻辑非 NOT [Quantity] > 0

    此外,逻辑运算符还可用作DAX函数,其语法类似于Excel的语法。例如,我们可以编写如下表达式:

    AND ( [CountryRegion] = "USA", [Quantity] > 0 )
    OR ( [CountryRegion] = "USA", [Quantity] > 0 )
    

    这些示例分别等效于以下内容:

     [CountryRegion] ="USA" && uantity]  > 0
     [CountryRegion] ="美国" ||  [Quantity]  > 0
    

    在编写复杂条件时,使用函数而不是运算符进行布尔逻辑运算将是很有帮助的。实际上,在格式化大段代码时,格式化和可读性函数比操作符容易得多。
    但是,函数的主要缺点是我们一次只能传递两个参数。因此,如果要评估的条件超过两个,则必须嵌套函数。

    表构造函数

    在DAX中,我们可以直接在代码中定义匿名表。如果表只有一列,则语法仅需要一列值(每行一个),并用花括号括起来。我们可以用括号来分隔多行,如果表是由一列组成的话,括号可以用也可以不用。例如,以下两个定义是等效的:

     {"Red","Blue","White"}
     {("Red" ),("Blue"),("White")}
    

    如果表有多个列,每行的数据则必须使用括号。每列的所有行应具有相同的数据类型;否则,DAX将自动将列转换数据类型至可以容纳整列各行所有数据类型。

    {
        ( "A", 10, 1.5, DATE ( 2017, 1, 1 ), CURRENCY ( 199.99 ), TRUE ),
        ( "B", 20, 2.5, DATE ( 2017, 1, 2 ), CURRENCY ( 249.99 ), FALSE ),
        ( "C", 30, 3.5, DATE ( 2017, 1, 3 ), CURRENCY ( 299.99 ), FALSE )
    }
    

    表构造函数通常与IN运算符一起使用。例如,以下是DAX表述中的有效语法:

    'Product'[Color] IN { "Red", "Blue", "White" }
    ( 'Date'[Year], 'Date'[MonthNumber] ) IN { ( 2017, 12 ), ( 2018, 1 ) }
    

    第二个示例显示使用IN运算符比较一组列(元组)的语法。这样的语法不能与比较运算符一起使用。换句话说,以下语法无效:
    ( 'Date'[Year], 'Date'[MonthNumber] ) = ( 2007, 12 )

    但是,我们可以使用单行表构造函数和IN运算符重写,如下所示:
    ( 'Date'[Year], 'Date'[MonthNumber] ) IN { ( 2007, 12 ) }

    条件语句

    在DAX中,我们可以使用IF函数编写条件表达式。例如,我们可以写一个依据数量值是否大于1分别返回MULTI或SINGLE的表达式。

    IF (
        Sales[Quantity] > 1,
        "MULTI",
        "SINGLE"
    )
    

    该IF函数有三个参数,但只有前两个是必选的。第三个是可选的,默认为BLANK。参见以下代码:

    IF (
        Sales[Quantity] > 1,
        Sales[Quantity]
    )
    

    它对应于以下显式版本:

    IF (
        Sales[Quantity] > 1,
        Sales[Quantity],
        BLANK ()
    )
    

    相关文章

      网友评论

          本文标题:2.1 理解DAX计算

          本文链接:https://www.haomeiwen.com/subject/pnpzqhtx.html