美文网首页
3.1 表函数简介

3.1 表函数简介

作者: jweishan | 来源:发表于2020-02-26 01:02 被阅读0次

    第3章 使用基本表函数

    3.1 表函数简介
    3.2 EVALUATE语法简介
    3.3 理解FILTER
    3.4 ALL和ALLEXCEPT
    3.5 了解VALUES,DISTINCT和空行
    3.6 将表用作标量值
    3.7 ALLSELECTED介绍

    在本章中,您将学习DAX中可用的基本表函数。表函数是常规的DAX函数,表函数返回表而不是返回单个值。在编写DAX查询和许多需要对表进行迭代的高级计算时,表函数很有用。本章包含此类计算的几个示例。

    本章的目的是介绍表函数的概念,而不是提供DAX中所有表函数的详细说明。第12章“使用表”和第13章“编写查询”中包含大量表函数。这里我们解释DAX中最常见和最重要的表函数,以及如何在常见情况下包括在DAX标量表达式中使用表函数。

    表函数简介

    到现在为止,您已经看到DAX表达式通常返回单个值,例如字符串或数字。结果为单个值的表达式称为标量表达式。定义度量值或计算列时,请始终编写标量表达式,如下所示:

    = 4 + 3
    = "DAX is a beautiful language"
    = SUM ( Sales[Quantity] )
    

    实际上,度量值的主要目标是产生在报表、数据透视表或图表中呈现的结果。归根结底,所有这些报告的来源都是一个数字,换句话说,就是一个标量表达式。不过,在标量值计算的过程中,您可能会使用表。例如,以下的简单迭代中将一张表用于计算销售额:
    Sales Amount := SUMX ( Sales, Sales[Quantity] * Sales[Net Price] )

    在以上示例中,SUMX遍历Sales表。因此,尽管完整计算的结果是标量值,但是在计算过程中,该公式会扫描Sales表。像下面的代码一样,相同的代码可以迭代表函数的结果。此代码仅计算数量大于一的行的销售额:

    Sales Amount Multiple Items :=
    SUMX (
        FILTER (
            Sales,
            Sales[Quantity] > 1
        ),
        Sales[Quantity] * Sales[Net Price]
    )
    

    在此示例中,我们使用FILTER函数代替对Sales的引用。直观上,FILTER是一种根据条件筛选表内容的函数。稍后我们将详细描述FILTER。现在,请务必注意,只要是在引用表的地方,就可以用表函数来替代表。

    在前面的代码中,您看到了一个用于求和汇总的筛选函数。这不是最佳实践。在下一章中,将学习如何使用CALCULATE来实现更灵活和有效的筛选。本章中示例的目的不是提供DAX度量值的最佳实例,而是说明表函数如何使用简单的表达式工作。稍后,我们将在更复杂的场景中应用这些概念。

    此外,在第2章“ DAX简介”中,您了解了可以将变量定义为DAX表达式的一部分,在那里,我们使用变量来存储标量值。但是,变量也可以存储表。例如,可以通过使用变量以以下方式编写先前的代码:

    Sales Amount Multiple Items :=
    VAR
        MultipleItemSales = FILTER ( Sales, Sales[Quantity] > 1 )
    RETURN
        SUMX (
            MultipleItemSales,
            Sales[Quantity] * Sales[Unit Price]
        )
    

    MultipleItemSales是一个存储整个表的变量,因为其表达式是表函数。我们强烈建议尽可能使用变量,这样代码更易于阅读。简单地为表达式指定个名称,您已经在很好地编写代码了。

    在计算列中或在迭代中,还可以使用RELATEDTABLE函数检索相关表的所有行。例如,Product表中的以下计算列用于计算相应产品的销售额:

    'Product'[Product Sales Amount] =
    SUMX (
        RELATEDTABLE ( Sales ),
        Sales[Quantity] * Sales[Unit Price]
    )
    

    表函数也可以嵌套。例如,以下Product表中计算列计算销售数量大于一的产品销售额:

    'Product'[Product Sales Amount Multiple Items] =
    SUMX (
        FILTER (
            RELATEDTABLE ( Sales ),
            Sales[Quantity] > 1
        ),
        Sales[Quantity] * Sales[Unit Price]
    )
    

    在示例代码中,相关表嵌套在筛选中。通常,当存在嵌套调用时,DAX首先评估最内层函数,然后评估其他函数直至最外层函数。

    如您将在后面看到的,嵌套调用的执行顺序可能会引起混乱,因为CALCULATECALCULATETABLE的评估顺序与FILTER不同。下一节,您将学习FILTER的行为。在第5章“了解CALCULATECALCULATETABLE”中可找到CALCULATECALCULATETABLE的描述。

    通常,我们不能将表函数的结果用作度量值或计算列的值。度量值和计算列均要求表达式为标量值。相反,我们可以将表表达式的结果分配给计算表。计算表是一种表,其值由DAX表达式确定,而不是从数据源加载。

    例如,我们可以使用如下表表达式创建一个包含所有单价大于3,000的产品的计算表:

    ExpensiveProducts =
    FILTER (
        'Product',
        'Product'[Unit Price] > 3000
    )
    

    计算表在Power BI和Analysis Services中可用,但在Power Pivot for Excel中不可用(截至2019年)。使用表函数的次数越多,在度量值中使用计算表和/或复杂的表表达式来创建更复杂的数据模型就越多。

    相关文章

      网友评论

          本文标题:3.1 表函数简介

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