Power BI Desktop 中的数据类型

本文介绍 Power BI Desktop 和数据分析表达式(DAX)支持的数据类型。

Power BI 加载数据时,它会尝试将源列的数据类型转换为支持更高效的存储、计算和数据可视化的数据类型。 例如,如果从 Excel 导入的值列没有小数值,Power BI Desktop 会将数据列转换为 整数 数据类型,这更适合存储整数。

此概念很重要,因为某些 DAX 函数具有特殊的数据类型要求。 在许多情况下,DAX 隐式转换数据类型,但在某些情况下,它不会转换。 例如,如果 DAX 函数需要 日期 数据类型,但列的数据类型是 文本,DAX 函数将无法正常工作。 因此,对列使用正确的数据类型非常重要和有用。

确定并指定列的数据类型

在 Power BI Desktop 中,可以在 Power Query 编辑器、表视图或报表视图中确定和指定列的数据类型:

  • 在 Power Query 编辑器中,选择列,然后在功能区的“转换”组中选择“数据类型”

    Power Query 编辑器的屏幕截图,其中显示了“数据类型”下拉列表选择。

  • 在“表视图”或“报表视图”中,选择列,然后选择功能区“列工具”选项卡上“数据类型”旁边的下拉箭头

    “表视图”的屏幕截图,其中显示了“数据类型”下拉列表选择。

Power Query 编辑器中的数据类型下拉列表选择有两种数据类型,表视图或报表视图中不存在:日期/时间/时区持续时间。 将这些数据类型的列加载到 Power BI 模型中时,日期/时间/时区 列转换为 日期/时间 数据类型,持续时间 列转换为 十进制数 数据类型。

Power Query 编辑器之外不支持 Binary 数据类型。 在 Power Query 编辑器中,当您在将二进制文件加载到 Power BI 模型之前先将其转换为其他数据类型时,可以使用 二进制 数据类型。 由于传统原因,表视图和报表视图菜单中存在 二进制 选择,但如果你尝试将 二进制 列加载到 Power BI 模型中,则可能会遇到错误。

数值类型

Power BI Desktop 支持三种数字类型:十进制数固定十进制数,以及 整数

可以使用表格对象模型 (TOM) 列的 DataType 属性指定数字类型的 DataType 枚举。 有关以编程方式修改 Power BI 中的对象的详细信息,请参阅 使用表格对象模型对 Power BI 语义模型进行编程。

十进制数

十进制数 是最常见的数字类型,可以使用小数值和整数处理数字。 十进制数 表示 64 位(八字节)浮点数,其负值范围是从 -1.79E +308-2.23E -308,正值范围是从 2.23E -3081.79E +308,还有 03434.01等数字,34.000367063 是有效的十进制数。

十进制数 类型可以表示的最高精度为 15 位。 小数分隔符可以在数字中的任何位置发生。 此类型对应于 Excel 存储其数字的方式,TOM 将此类型指定为 DataType.Double 枚举。

固定十进制数

固定十进制数 数据类型具有小数分隔符的固定位置。 十进制分隔符的右侧始终有 4 位数字,并允许有 19 位有效数字。 固定十进制数 可以表示的最大值是正或负 922,337,203,685,477.5807

固定十进制数 类型在舍入可能会导致错误的情况下非常有用。 具有小分数值的数字有时可能会累积,导致数字略微不准确。 通过截断十进制分隔符右侧四位数后的数字,“定点十进制数”类型可以帮助你避免此类错误

此数据类型对应于 SQL Server 的 Decimal (19,4),或 Excel 中的 Analysis Services 和 Power Pivot 中的 Currency 数据类型。 TOM 将此类型指定为 DataType.Decimal 枚举。

整数

整数 表示 64 位(八字节)整数值。 由于它是一个整数,因此整数小数位右侧没有数字。 此类型允许介于 -9,223,372,036,854,775,807-2^63+1)和 9,223,372,036,854,775,8062^63-2)之间的正或负整数字,总计19位数,因此可以表示数值数据类型的最大可能数字。

固定的小数 类型一样,当需要控制舍入时,整数 类型非常有用。 TOM 将“整数”数据类型表示为 DataType.Int64 枚举

注意

Power BI Desktop 数据模型支持 64 位整数值,但由于 JavaScript 限制,可以安全地表达的 Power BI 视觉对象的最大数量是 9,007,199,254,740,9912^53-1)。 如果数据模型具有较大的数字,则可以在将数据模型添加到视觉对象之前通过计算来减小其大小。

数字类型计算的准确性

根据浮点数的 IEEE 754 标准,“十进制数”数据类型的列值存储为“近似”数据类型。 近似数据类型具有固有的精度限制,因为与其存储确切的数字值,不如存储非常接近或舍入的近似值。

如果浮点值无法可靠地量化浮点位数,则可能会出现精度损失或不精确。 在某些报告方案中,不精确可能显示为意外或不准确的计算结果。

十进制数 数据类型的值之间进行的相等性比较运算可能会返回意外结果。 等式比较包括等于 =、大于 >、小于 <、大于或等于 >=以及小于或等于 <=

在 DAX 表达式中使用 RANKX 函数 时,此问题最为明显,该表达式计算结果两次,结果略有不同。 报表用户可能不会注意到这两个数字之间的差异,但排名结果可能明显不准确。 为了避免意外的结果,可以将列数据类型从 十进制数 更改为 固定十进制数整数,或使用 ROUND执行强制舍入。 固定十进制数 数据类型具有更高的精度,因为小数分隔符始终右侧有四位数字。

对“十进制数”数据类型的列值进行求和的计算很少会返回意外结果。 此结果很可能与具有大量正数和负数的列有关。 总和结果受列中各行的值分布的影响。

如果所需的计算在对大多数负数求和之前对大多数正数求和,则开头的大部分正和可能会使结果偏斜。 如果计算碰巧添加均衡的正数和负数,则查询将保留更精确的精度,因此返回更准确的结果。 为了避免意外的结果,可以将列数据类型从 十进制数 更改为 固定十进制数整数

日期/时间类型

Power BI Desktop 在 Power Query 编辑器中支持五种 日期/时间 数据类型。 加载期间,日期/时间/时区持续时间 转换为 Power BI Desktop 数据模型。 该模型支持 日期/时间,也可以将值格式化为 日期 或独立 时间

  • 日期/时间 表示日期和时间值。 基础 日期/时间 值存储为 十进制数 类型,因此可以在两种类型之间进行转换。 时间部分存储为 1/300 秒 (3.33 ms) 的整数倍的分数。 该数据类型支持 1900 年至 9999 年之间的日期。

  • “日期”仅表示日期,没有时间部分。 “日期”转换为模型时,其值与分数位是零的“日期/时间”值相同

  • 时间 仅表示时间,不包含日期部分。 “时间”转换为模型时,其值与小数点左侧没有数字的“日期/时间”值相同

  • 日期/时间/时区 表示具有时区偏移量的 UTC 日期/时间,并在加载到模型中时转换为 日期/时间。 Power BI 模型不会根据用户的位置或区域设置调整时区。 在美国将值 09:00 加载到模型中时,无论在何处打开或查看报表,它都将显示为 09:00。

  • 持续时间 表示时间长度,并在加载到模型中时转换为 十进制数 类型。 作为 十进制数 类型,可以对 日期/时间 值进行加减,会得到正确的结果,并且这些值可以轻松用于显示数量级的可视化效果中。

文本类型

“文本”数据类型是 Unicode 字符数据字符串,可以是字母、数字或以文本格式表示的日期。 根据 Power BI 的基础 Power Query 引擎,字符串长度的实际最大限制约为 32,000 个 Unicode 字符,以及对 文本 数据类型长度的限制。 超出实际最大限制的文本数据类型可能会导致错误。

Power BI 存储文本数据的方式可能会导致数据在某些情况下以不同的方式显示。 后续部分介绍可能导致 文本 数据在 Power Query 编辑器中查询数据并将其加载到 Power BI 之间的外观略有变化的常见情况。

区分大小写

在 Power BI 中存储和查询数据的引擎不区分大小写,并将字母的不同大小写形式视为相同值。 “A”等于“a”。 但是,Power Query 区分大小写,其中“A”与“a”不同。 区分大小写的差异可能会导致文本数据在加载到 Power BI 后似乎莫名其妙地更改大小写的情况。

以下示例显示订单数据:每个订单唯一的 OrderNo 列,以及一个 Addressee 列,该列显示订单时手动输入的寻址人姓名。 Power Query 编辑器显示多个订单,这些订单在系统中输入的收件人姓名不同,其大小写也不同

在Power Query中具有各种大写的文本数据的屏幕截图

Power BI 加载数据后,“数据”选项卡中重复名称的大小写从原始条目更改为大小写变体之一

显示加载到 Power BI 后大小写更改的文本数据的屏幕截图。

发生此更改是因为 Power Query 编辑器区分大小写,因此它显示的数据与源系统中存储的数据完全相同。 在 Power BI 中存储数据的引擎不区分大小写,因此它将字符的小写和大写版本视为相同的。 加载到 Power BI 引擎中的 Power Query 数据可能会相应地更改。

从顶部开始,Power BI 引擎在加载数据时单独评估每一行。 对于每个文本列(例如 Addressee),引擎会存储包含唯一值的字典,以通过数据压缩提高性能。 引擎将 Addressee 列中的前三个值视为唯一值,并将其存储在字典中。 之后,由于引擎不区分大小写,因此它将名称视为相同。

引擎将名称“Taina Hasu”视为与“TAINA HASU”和“Taina HASU”相同,因此它不存储这些变体,而是引用它存储的第一个变体。 名称“MURALI DAS”以大写字母显示,因为这是引擎在从上到下加载数据时第一次计算它时的名称。

此图演示了评估过程:

显示数据加载过程及将文本值映射到唯一值字典的关系图。

在前面的示例中,Power BI 引擎加载第一行数据,创建 Addressee 字典,并向其中添加 Taina Hasu。 引擎还在加载的表的“收件人”列中添加对该值的引用。 引擎对第二行和第三行执行相同操作,因为这些名称在忽略大小写时不等效于其他名称。

对于第四行,引擎将该值与字典中的名称进行比较,并查找名称。 由于引擎不区分大小写,因此“TAINA HASU”和“Taina Hasu”是相同的。 引擎不会向字典添加新名称,但引用现有名称。 其余行也会发生相同的过程。

注意

由于 Power BI 中存储和查询数据的引擎不区分大小写,因此在 DirectQuery 模式下处理区分大小写的数据源时,请尤其注意。 Power BI 假定源已消除重复行。 由于 Power BI 不区分大小写,因此它将只因大小写而不同的两个值视为重复值,而源不会将它们视为重复值。 在这种情况下,最终结果未定义。

为了避免这种情况,如果将 DirectQuery 模式用于区分大小写的数据源,请在源查询或 Power Query 编辑器中规范化大小写。

前导空格和尾随空格

Power BI 引擎会自动去除在文本数据之后的尾随空格,但不会删除数据前的前导空格。 为了避免混淆,在使用包含前导或尾随空格的数据时,应使用 Text.Trim 函数删除文本开头或结尾处的空格。 如果不删除前导空格,可能会因为值重复而无法创建关系,或者视觉对象可能会返回意外结果。

以下示例显示有关客户的数据:包含客户名称的 Name 列,以及每个条目唯一的 索引 列。 为了清楚起见,名称显示在引号中。 客户名称重复了四次,但每次都包含不同的前导空格和尾随空格组合。 这些变化可能会随着一段时间内的手动数据输入而发生。

前导空格 尾随空格 名字 索引 文本长度
1 “迪伦·威廉姆斯” 1 14
2 是的 “迪伦·威廉姆斯” 10 15
3 是的 “迪伦·威廉姆斯” 20 15
4 是的 是的 “迪伦·威廉姆斯” 40 16

在 Power Query 编辑器中,生成的数据如下所示。

Power Query 编辑器中具有各种前导空格和尾随空格的文本数据的屏幕截图。

加载数据后转到 Power BI 中的“”选项卡时,同一个表如下图所示,行数与之前相同。

加载到 Power BI 后相同文本数据的屏幕截图将返回与之前相同的行数。

但是,基于此数据的可视化仅返回两行。

基于仅返回两行数据的相同数据的表视觉对象的屏幕截图。

在上图中,第一行总“索引”字段值为 60,因此视觉对象中的第一行表示已加载数据的最后两行。 第二行总“索引”值为 11,表示前两行。 视觉对象和数据表之间的行数差异是由引擎自动删除(或剪裁)尾随空格,而不是前导空格所致。 因此,引擎对第一行和第二行以及第三行和第四行求值相同,视觉对象则返回这些结果。

此行为还可能导致与关系相关的错误消息,因为检测到重复值。 例如,根据关系配置,你可能会看到类似于下图的错误:

有关重复值的错误消息的屏幕截图。

在其他情况下,可能无法创建多对一或一对一关系,因为检测到重复值。

关系对话框的屏幕截图,其中显示了与检测到重复值相关的“基数对此关系无效”错误。

可以将这些错误追溯到前导空格或尾随空格,并使用 Text.Trim 或在“转换”下选择“格式”>“剪裁”删除 Power Query 编辑器中的空格来解决这些问题

True/False 类型

True/false 数据类型是 TrueFalse的布尔值。 为了获得最佳且最一致的结果,在 Power BI 中加载包含布尔值 true/false 信息的列时,请将列类型设置为 True/False

在某些情况下,Power BI 会以不同的方式转换和显示数据。 本部分介绍转换布尔值的常见情况,以及如何解决在 Power BI 中创建意外结果的转换。

在此示例中,您将加载关于您的客户是否注册了您的新闻稿的信息。 值为 TRUE 表示客户已注册新闻简报,而值为 FALSE 表示客户尚未注册。

但是,将报表发布到 Power BI 服务时,新闻稿注册状态列会显示 0-1,而不是 TRUEFALSE的预期值。 以下步骤介绍了此转换的发生方式以及如何防止转换。

此表的简化查询如下图所示:

显示设置为布尔值的列的屏幕截图。

“订阅新闻稿”列的数据类型设置为“任何”,因此,Power BI 将数据以“文本”的形式加载到模型中

显示加载到 Power BI 中的数据的屏幕截图。

添加显示每个客户详细信息的简单可视化效果时,数据将按预期显示在视觉对象中,无论是在 Power BI Desktop 中还是发布到 Power BI 服务时。

显示数据按预期方式显示的视觉对象的屏幕截图。

但是,在 Power BI 服务中刷新语义模型时,视图中的 订阅新闻稿 列将值显示为 -10,而不是显示为 TRUEFALSE

显示刷新后以意外格式显示数据的视觉对象的屏幕截图。

如果从 Power BI Desktop 重新发布报表,“订阅新闻稿”列将再次按预期显示 TRUE 或 FALSE,但是一旦 Power BI 服务中发生刷新,这些值将再次更改为显示 -1 和 0

防止这种情况的解决方案是在 Power BI Desktop 中将任何布尔列设置为 True/False 类型,然后重新发布报表。

将列的数据类型更改为 True/False 的屏幕截图。

进行更改时,可视化显示 订阅通讯 列中的值有所不同。 并不是所有文本都像在表中输入的那样为大写字母,而是只有第一个字母为大写。 此更改是更改列的数据类型的一个结果。

更改数据类型时值以不同方式显示的屏幕截图。

更改数据类型、重新发布到 Power BI 服务并刷新后,报表将值显示为 TrueFalse,如预期所示。

显示使用 True/False 数据类型的 true 或 false 值的屏幕截图在刷新后按预期显示。

总之,在 Power BI 中使用布尔数据时,请确保列在 Power BI Desktop 中设置为 True/False 数据类型。

空白类型

Blank 是一种 DAX 数据类型,用于表示和替换 SQL 的空值。 可以使用 BLANK 函数创建空白,并使用 ISBLANK 逻辑函数测试空白。

二进制类型

可以使用 Binary 数据类型来表示采用二进制格式的任何数据。 在 Power Query 编辑器中,如果在将二进制文件加载到 Power BI 模型之前将其转换为其他数据类型,则可以使用此数据类型。

Power BI 数据模型中不支持二进制列。 由于遗留原因,“二进制”选项存在于表视图和报表视图菜单中,但如果尝试将“二进制”列加载到 Power BI 模型,则可能会遇到错误

注意

如果二进制列位于查询步骤的输出中,则尝试通过网关刷新数据可能会导致错误。 建议显式删除任何二进制列作为查询的最后一步。

表类型

DAX 在许多函数中使用表数据类型,例如聚合和时间智能计算。 某些函数需要对表的引用。 其他函数返回一个表,该表随后可以用作其他函数的输入。

在某些需要表作为输入的函数中,你可以指定计算结果为表格的表达式。 某些函数需要引用基表。 有关特定函数的要求的信息,请参阅 DAX 函数参考

隐式和显式数据类型转换

每个 DAX 函数对用作输入和输出的数据类型具有特定要求。 例如,某些函数需要一些参数的整数和其他参数的日期。 其他函数需要文本或表。

如果指定为参数的列中的数据与函数所需的数据类型不兼容,DAX 可能会返回错误。 但是,在可能的情况下,DAX 会尝试隐式将数据转换为所需的数据类型。

例如:

  • 如果将日期输入为字符串,DAX 将解析该字符串,并尝试将其转换为 Windows 日期和时间格式之一。
  • 可以添加 TRUE + 1 并获取结果 2,因为 DAX 隐式将 TRUE 转换为 数字 1,并执行操作 1+1
  • 如果在两列中添加一个值,其中一个值表示为文本(“12”),另一个作为数字(12),DAX 会将字符串隐式转换为数字,然后对数值结果执行加法。 表达式 = “22” + 22 返回 44
  • 如果尝试连接两个数字,DAX 会将它们显示为字符串,然后连接。 表达式 = 12 & 34 返回 “1234”

隐式数据转换表

运算符通过在执行请求的运算之前强制转换所需的值来确定 DAX 执行的转换类型。 下表列出了运算符,以及当数据类型与相交单元格中的数据类型配对时 DAX 对它执行的转换。

注意

这些表不包括 文本 数据类型。 当数字以文本格式表示时,在某些情况下,Power BI 会尝试确定数字类型并将数据表示为数字。

加法 (+)

整数 货币 REAL 日期/时间
INTEGER 整数 货币 REAL 日期/时间
CURRENCY 货币 货币 REAL 日期/时间
REAL REAL REAL REAL 日期/时间
日期/时间 日期/时间 日期/时间 日期/时间 日期/时间

例如,如果加法运算将实际数与货币数据结合使用,DAX 会将这两个值转换为 REAL,并将结果返回为 REAL。

减法 (-)

下表中,行标题是被减数(左侧),列标题是减数(右侧)。

整数 货币 REAL 日期/时间
INTEGER 整数 货币 REAL REAL
CURRENCY 货币 货币 REAL REAL
REAL REAL REAL REAL REAL
日期/时间 日期/时间 日期/时间 日期/时间 日期/时间

例如,如果减法运算使用具有任何其他数据类型的日期,DAX 会将这两个值转换为日期,并且返回值也是日期。

注意

数据模型支持一元运算符 - (负),但此运算符不会更改操作数的数据类型。

乘法 (*)

整数 货币 REAL 日期/时间
INTEGER 整数 货币 REAL 整数
CURRENCY 货币 REAL 货币 货币
REAL REAL 货币 REAL REAL

例如,如果乘法运算将整数与实数组合在一起,DAX 会将这两个数字转换为实数,并且返回值也是 REAL。

除法 (/)

下表中,行标题是分子(左侧),列标题是分母(右侧)。

整数 货币 REAL 日期/时间
INTEGER REAL 货币 REAL REAL
CURRENCY 货币 REAL 货币 REAL
REAL REAL REAL REAL REAL
日期/时间 REAL REAL REAL REAL

例如,如果除法运算将整数与货币值组合在一起,DAX 会将这两个值转换为实数,结果也是实数。

比较运算符

在比较表达式中,DAX 认为布尔值大于字符串值,字符串值大于数值或日期/时间值。 数字和日期/时间值具有相同的排名。

DAX 不对布尔值或字符串值执行任何隐式转换。 根据另一个比较值的数据类型,BLANK 或空值转换为 0、"" 或 False

以下 DAX 表达式说明了此行为:

  • =IF(FALSE()>"true","Expression is true", "Expression is false") 返回“表达式为真”。

  • =IF("12">12,"Expression is true", "Expression is false") 返回“表达式为真”。

  • =IF("12"=12,"Expression is true", "Expression is false") 返回“表达式为假”。

DAX 对数值或日期/时间类型执行隐式转换,如下表所述:

比较
操作员
整数 货币 REAL 日期/时间
INTEGER 整数 货币 REAL REAL
CURRENCY 货币 货币 REAL REAL
REAL REAL REAL REAL REAL
日期/时间 REAL REAL REAL 日期/时间

空白、空字符串和零值

DAX 以相同的新值类型 BLANK 表示 null、空值、空单元格或缺失值。 还可以使用 BLANK 函数生成空白,也可以使用 ISBLANK 函数测试空白。

添加或串联等操作如何处理空白取决于单个函数。 下表总结了 DAX 和 Microsoft Excel 公式如何处理空白之间的差异。

表达式 DAX Excel
BLANK + BLANK BLANK 0 (零)
BLANK + 5 5 5
BLANK * 5 BLANK 0 (零)
5/BLANK 无限 错误
0/BLANK NaN 错误
BLANK/BLANK BLANK 错误
FALSE OR BLANK FALSE FALSE
FALSE AND BLANK FALSE FALSE
TRUE OR BLANK TRUE TRUE
TRUE AND BLANK FALSE TRUE
BLANK OR BLANK BLANK 错误
BLANK AND BLANK BLANK 错误

可以使用 Power BI Desktop 和数据执行各种操作。 有关 Power BI 功能的详细信息,请参阅以下资源: