多维模型的 DAX

适用于: SQL Server Analysis Services Azure Analysis Services Fabric/Power BI Premium

本文介绍 Power BI 如何使用 DAX (数据分析表达式) 查询来针对 SQL Server Analysis Services 中的多维模型进行报告。

过去,报告应用程序使用 MDX (多维表达式) 作为针对多维数据库的查询语言。 MDX 针对常见的视觉模式(如 Excel 中的数据透视表)和其他面向多维业务语义的报告应用程序进行优化。 从 SQL Server 2012 SP1 开始,Analysis Services 支持对多维和表格模型同时使用 DAX 和 MDX。 但是,DAX 最初是为表格数据模型设计的。 虽然 DAX 被认为更易于使用,但它也更侧重于报表和仪表板中的表、图表和地图等更简单的数据可视化效果。 Power BI 使用 DAX 查询表格和多维模型

由于 DAX 主要用于表格模型,因此在对多维模型使用 DAX 时,必须了解一些有趣且有用的映射和约束。

兼容性

Power BI 使用 DAX 查询 SQL Server 2016 及更高版本 Enterprise 或 Standard 版本中的 Analysis Services 多维模型。 SQL Server 2012 和 SQL Server 2014 企业版或商业智能版本也受支持,但这些版本现在不再受主流支持。

功能

DAX 不是 MDX 的子集。 DAX 最初设计为类似于 Excel 公式语言。 在表格模型中,DAX 用于由表和关系组成的关系数据存储。 DAX 还用于创建自定义度量值、计算列和行级安全规则。

除了作为计算语言之外,DAX 还可用于执行查询。 本文介绍 DAX 查询如何针对多维模型工作。

MDX 和 DAX 之间的交互

DAX 表达式仅在表格模型中受支持。 不能在多维模型中使用 DAX 表达式创建的度量值。 对多维模型的 DAX 查询可以引用在该模型中定义的度量值或其他计算,但这些计算必须使用 MDX 语言进行创作。 当需要 MDX 表达式(反之亦然)时,不能使用 DAX 表达式,某些 DAX 函数(如 PATH)根本不适用于多维建模。

DAX 语法

DAX 公式的语法与 Excel 公式的语法非常相似,并且使用函数、运算符和值的组合。 若要详细了解单个函数的语法,请参阅 DAX 函数参考

多维到表格对象映射

Analysis Services 提供多维模型的表格模型元数据表示形式。 然后,多维模型中的对象在 Power BI 中表示为表格对象。 此映射通过使用 DISCOVER_CSDL_METADATA 架构行集向 Power BI 公开。

对象映射

多维对象 表格对象
多维数据集 建模
多维数据集维度 (Cube dimension)
维度属性(键、名称)
度量值组
测量 测量
没有度量值组的度量值 在名为 Measures 的表中
度量值组多维数据集维度关系 关系
透视 透视
KPI KPI
用户/父子层次结构 层次结构
显示文件夹 显示文件夹

度量值、度量值组和 KPI

多维多维数据集中的度量值组在 Power BI 字段列表中显示为带有计算器图标的表。

度量值组内的度量值显示为度量值。 如果有没有关联的度量值组的计算度量值,则会将其分组到名为“度量值”的特殊表中。

为了帮助简化更复杂的多维模型,模型作者可以在多维数据集中定义要位于某个显示文件夹内的一组度量值或 KPI。 Power BI 可以显示显示文件夹及其中的度量值和 KPI。

度量值组中的度量值和 KPI

Power BI 字段列表中的度量值和 KPI

作为变体的度量值

多维模型中的度量值是变体。 这意味着度量值不强类型化,可以具有不同的数据类型。 例如,在下图中,“财务报告”表中的“金额”度量值默认为“货币”数据类型,但“统计科目”分类汇总的字符串值 NA 为 String 数据类型。 Power BI 将某些度量值识别为变体,并在不同的可视化效果中显示正确的值和格式。

作为变体的度量值

度量值作为变体

隐式度量值

表格模型允许用户创建“隐式”度量值,如对字段的计数、求和或计算平均值。 对于多维模型,因为维度属性数据以不同方式存储,查询隐式度量值可能需要很长时间。 因此,针对多维模型的隐式度量值在 Power BI 中不可用。

维度、属性和层次结构

多维数据集维度显示为表格元数据中的表。 在“Power BI 字段”列表中,维度属性显示为显示文件夹中的列。 AttributeHierarchyEnabled 属性设置为 False 的维度属性;例如:Customer 维度中的 Birth Date 属性或设置为 false 的 AttributeHierarchyVisible 属性将不会显示在 Power BI 字段列表中。 多层层次结构或用户层次结构;例如,“客户”维度中的“客户地理位置”在 Power BI 字段列表中作为层次结构公开。 维度属性的隐藏 UnknownMembers 在 DAX 查询和 Power BI 中公开。

SQL Server Data Tools (SSDT) 和 Power BI 字段列表中的维度、属性和层次结构

SSDT 和 Power BI 字段列表中的维度、属性、层次结构

维度属性类型

多维模型支持将维度属性与特定维度属性类型关联。 下图显示了 “地理” 维度,其中“城市”、“省/自治区”、“国家/地区”和“邮政编码”维度属性具有关联的地理类型。 它们在表格元数据中显示。 Power BI 可识别元数据,使用户能够创建地图可视化效果。 这由 Power BI 字段列表中的“地理”表中“城市”、“国家/地区”、“邮政编码”和“State-Province”列旁边的地图图标指示。

SSDT 和 Power BI 字段列表中的地域维度

SSDT 和 Power BI 字段列表中的维度属性类型

维度的计算成员

多维模型支持具有单个真实成员的 All 子级的计算成员。 显示此类型的计算成员时应用的额外约束如下:

  • 必须是单个真实成员(维度具有多个属性时)。
  • 包含计算成员的属性不能是维度的键属性,除非它是仅有的一个属性。
  • 包含计算成员的属性不能是父子属性。

用户层次结构的计算成员不会在 Power BI 中公开,但是,用户仍能够连接到包含用户层次结构中计算成员的多维数据集。

默认成员

多维模型支持维度属性的默认成员。 当为查询聚合数据时,Analysis Services 使用默认成员。 维度属性的默认成员显示为表格元数据中相应列的默认值或筛选器。

应用属性时,Power BI 的行为与 Excel 数据透视表的行为大致相同。 当用户 (包含默认值的表、矩阵或图表) 向 Power BI 可视化效果添加列时,将不会应用默认值,并且将显示所有可用值。 如果用户将列添加到 Filters,则应用默认值。

维度安全性

多维模型通过角色支持维度和单元级安全性。 使用 Power BI 连接到多维数据集的用户经过身份验证,并针对用户所属的角色定义的相应权限进行评估。 应用维度安全性时,Power BI 中的用户看不到相应的维度成员。 但是,如果用户在限制某些单元格的位置定义了单元格安全权限,则该用户无法使用 Power BI 连接到多维数据集。 在某些情况下,在从受保护的数据计算一部分数据时用户可以看到聚合的数据。

不可聚合的属性/层次结构

在多维模型中,维度的属性可以将 IsAggregatable 属性设置为 False。 这意味着模型作者指定了报表应用程序在查询数据时不应跨层次结构 (属性或多级) 聚合数据。 在 Power BI 中,此维度属性公开为分类汇总不可用的列。 在下图中,可以看到不可聚合层次结构“帐户”的示例。 Accounts 父子层次结构的最高级别是不可聚合的,而其他级别则可以聚合。 在“帐户”层次结构 (前两个级别) 矩阵可视化中,可以看到 “帐户级别 02 ”的分类汇总,但最顶层的 “帐户级别 01”则看不到小计。

Power BI 中的不可聚合层次结构

度量值作为变体

图像

Power BI 提供呈现图像的功能。 在多维模型中,提供要在 Power BI 中显示的图像的方法之一是公开包含 URL 的列 (统一资源定位符) 图像。 Analysis Services 支持将维度属性标记为 ImageURL 类型。 然后,此数据类型在表格元数据中提供给 Power BI。 然后,Power BI 可以下载并显示可视化效果中的 URL 中指定的图像。

SSDT 中的 ImageURL 维度属性类型

SSDT 中的 ImageURL 维度

父子层次结构

多维模型支持父子层次结构,这些层次结构在表格元数据中作为层次结构公开。 父子层次结构的每个级别显示为隐藏的列。 父子维度的键属性不在表格元数据内显示。

SSDT 和 Power BI 字段列表中的父子层次结构

SSDT 和 Power BI 字段列表中的父子层次结构

透视和翻译

透视是多维数据集的视图,其中仅在客户端工具中显示某些维度或度量值组。 可以将透视名称指定为 Cube 连接字符串 属性的值。 例如,在以下连接字符串,“直接销售”是多维模型中的透视:

Data Source=localhost;Initial Catalog=AdventureWorksDW-MD;Cube='Direct Sales'

多维数据集可以为模型中的各种语言指定元数据和数据翻译。 若要查看数据和元数据 (转换) 应用程序可以将可选的区域设置标识符属性添加到连接字符串,例如:

Data Source=localhost;Initial Catalog=AdventureWorksDW-MD;Cube='Adventure Works'; Locale Identifier=3084

Power BI Desktop连接到多维模型时,它会自动将标识的当前用户区域设置传递到服务器。 但是,对于发布到Power BI 服务的报表,不会发生这种情况。

不支持的功能

单元级别安全性 - Power BI 报表不支持。

操作 - 在 Power BI 报表或针对多维模型的 DAX 查询中不受支持。

命名集 - 在多维模型中,在 Power BI 或针对多维模型的 DAX 查询中不受支持。

注意

使用 Power BI 时,不支持的操作和命名集不会阻止用户连接到多维模型并浏览多维模型。

CSDLBI 注释

多维数据集元数据被带商业智能注释的概念架构定义语言 (CSDLBI) 作为基于实体数据模型 (EDM) 的概念模型显示。

将 DISCOVER_CSDL_METADATA 请求发送到 Analysis Services 实例时,将多维元数据表示为 CSDLBI 文档或 CSDL out 中的表格模型命名空间。

示例:DISCOVER_CSDL_METADATA请求

<Envelopexmlns="http://schemas.xmlsoap.org/soap/envelope/">
   <Body>
      <Discoverxmlns="urn:schemas-microsoft-com:xml-analysis">
         <RequestType>DISCOVER_CSDL_METADATA</RequestType>
         <Restrictions>
            <RestrictionList>
              <CATALOG_NAME>"catalogname"<CATALOG_NAME>
            </RestrictionList>
         </Restrictions>
         <Properties>
            <PropertyList>
            </PropertyList>
         </Properties>
      </Discover>
   </Body>
</Envelope>

DISCOVER_CSDL_METADATA请求具有以下限制:

名称 必须 说明
CATALOG_NAME 目录\数据库名称。
PERSPECTIVE_NAME 是(如果多维数据集包含多个透视)。 如果只有一个多维数据集或有一个默认透视,则为可选的。 多维数据库中的多维数据集名称或透视名称。
VERSION 客户端请求的 CSDL 版本。 在版本 2.0 中支持多维功能和构造。

返回的 CSDL out 文档将模型表示为命名空间,其中包含实体、关联和属性。

若要详细了解 CSDLBI 注释,请参阅 CSDL 的 BI 注释的技术参考[MS-CSDLBI]:使用商业智能注释的概念架构定义文件格式

SuperDAXMD

SQL Server Analysis Services的每个版本中,改进都支持新的和现有的 DAX 函数和功能。 在 SQL Server 2019 CU5 中,首次为非正式称为 SuperDAX 的表格模型引入的一类 DAX 函数现已为多维模型启用。

尽管某些现有的 DAX 查询模式可能需要重新设计,但 SuperDAX 函数可显著改进查询性能。 对多维模型使用 SuperDAX 的新式 DAX 查询模式为使用 Power BI 的组织提供了强大的激励机制,让他们使用 CU5 将其多维数据源服务器升级到 SQL Server 2019。 若要了解详细信息,请参阅 多维模型的 SuperDAX

另请参阅

DAX 参考