# CalcDim- 图表函数

在维度表达式中使用时，CalcDim() 将覆盖引擎对表达式内部处理方式的自动解释。具体而言，该函数可防止在数据模型中创建新的内部字段。相反，应用程序中的选择将被视为原始数据模型中适用字段中的选择。

此功能无法在加载脚本中使用。此外，提高系统性能的最佳做法是尽量通过加载脚本将计算维度中使用的字段作为逻辑字段加载。CalcDim() 提供了一种方法，可以在无法从脚本加载已计算字段的情况下控制引擎行为。

在 Qlik Sense 中，维度表达式默认为即时字段，也就是说，作为一个实际字段，在当前选择条形中显而易见，并按需创建。选择会应用和推断到该字段，类似于脚本内的任何逻辑字段。

用 CalcDim() 包装的表达式的行为方式与所有计算维度表达式在 QlikView 中的行为方式相同，即计算值与底层源字段值的临时映射。所有已计算字段都可以通过 CalcDim() 功能转移到计算维度中，因为计算维度与相应已计算字段相比，根据数据模型需要满足的要求更少。在某些情况下，数据模型可能会阻止使用已计算字段即时计算，而在其他情况下则不会，为了保证所有计算维度都有类似行为，这种转换可能是可取的。

[已计算字段](https://community.qlik.com/t5/Design/Calculated-Fields/ba-p/1694383)

CalcDim(expr)

返回数据类型： 双

参数

| 参数 | 描述 |
| --- | --- |
| expr | 作为维度使用的表达式，或作为维度表达式中的分段使用的表达式。 |

## 适合使用它的情况

CalcDim() 在需要对 Qlik 引擎如何处理维度表达式中调用的字段进行更多控制时非常有用。

默认情况下，当使用自定义维度表达式时，Qlik Sense 会自动地决定是否在数据模型中创建和引用内部字段。 Qlik Sense 会在可能的情况下创建并使用这些内部字段。在不可能的情况下，表达式会参照其所依赖的现有数据模型字段来进行处理。

根据您的使用情况，这种自动处理可能并非总是可取。例如，如果在维度表达式中使用变量，自动创建新字段就会发生问题。在这种情况下，请使用 CalcDim() 强制在不使用此方法的情况下处理表达式。

某些常见用例如下：

* 您已将 QlikView 内容迁移到 Qlik Sense ，并希望保留 QlikView 对计算维度的处理方法。

* 您希望简化应用程序中的选择行为。例如，您希望将字段选择显示为原始数据模型中字段的选择，而不是新字段的选择。

* 您的用例需要一种临时表达方式，以保证一致性和性能。例如，如果您的维度表达式包含用户可控的动态可视化参数，如可控格式、截止值或句点。

函数示例

| 示例 | 结果 |
| --- | --- |
| `=CalcDim(if(Year < 2023, 'Older', Year))` | 在使用此维度的可视化中进行选择，将被处理并显示为数据模型中相关 Year 字段值的选择。<br><br>反之，假设您没有用 CalcDim() 包装表达式。在这种情况下，它看起来就像这样：<br><br>`=if(Year < 2023, 'Older', Year)`<br><br>在上述表达式中进行选择会被处理并显示为内部字段 =if(Year &lt; 2023, 'Older', Year) 中的选择，而数据模型中并没有这个字段。 |

## 示例 1 - 简单比较

[](https://help.qlik.com/en-US/sense/Subsystems/Hub/Content/Sense_Hub/Scripting/SystemFunctions/calcdim.htm)

#### 图表表达式和结果

概述

在这个例子中，您将：

* 添加内联表并将数据加载到应用程序中。

* 创建表格，使数据可视化并进行计算。

* 在表格中进行选择，观察行为的差异。

打开 数据加载编辑器，并将以下加载脚本添加到新部分。

加载脚本会加载一个内联表。该表包括两个字段：一个是个人姓名字段，另一个是个人姓氏字段。

加载脚本

```
Names:

Load * inline [
FirstName,LastName
John,Doe
Amanda,Honda
Amalia,Craig
Cart,Lynch
];
```

表格创建

加载数据并打开工作表。创建新表并将这些字段添加为维度：

* FirstName

* LastName

接下来，在表格中添加以下每个表达式来作为维度：

* =FirstName & ' ' & LastName

* =CalcDim(FirstName & ' ' & LastName)

表格应如下所示。

带示例结果 Qlik SenseQlik Sense 表

| FirstName | LastName | =FirstName & ' ' & LastName | =CalcDim(FirstName & ' ' & LastName) |
| --- | --- | --- | --- |
| John | Doe | John Doe | John Doe |
| Amanda | Honda | Amanda Honda | Amanda Honda |
| Amalia | Craig | Amalia Craig | Amalia Craig |
| Cart | Lynch | Cart Lynch | Cart Lynch |

比较：进行选择

在 =FirstName & ' ' & LastName 表格一栏中，选择值 JohnDoe。请注意，在选择工具栏中，数值是从名为 =FirstName' 'LastName 的字段中选择的。

清除选择。

在 =CalcDim(FirstName ' ' LastName) 表格一栏中，选择值 JohnDoe。在选择工具栏中，可从两个不同的字段中选择值：FirstName 和 LastName 。

这两个表达式呈现相同的信息：FirstName 和 LastName 字段的串联。不同之处在于，如果没有 CalcDim() ，则会创建一个合成字段来存储计算结果。通过 CalcDim() ，数据模型中的原始字段将作为计算维度的基础。

## 例 2 - 修改默认行为的实际用例

[](https://help.qlik.com/en-US/sense/Subsystems/Hub/Content/Sense_Hub/Scripting/SystemFunctions/calcdim.htm)

#### 图表表达式和结果

概述

在本例中，我们创建了引用变量的动态维度表达式，而非引用静态值。

在这个例子中，您将：

* 添加内联表并将数据加载到应用程序中。

* 创建一个变量，以动态存储一个值。

* 创建表格，使数据可视化并进行计算。

* 在表格中进行选择，观察行为的差异。

打开 数据加载编辑器，并将以下加载脚本添加到新部分。

加载脚本会加载一个内联表。该表包括一个日期字段和一个已计算字段 Year，后者是从原始日期推导出来的。

加载脚本

```
SET DateFormat='MM/DD/YYYY';
						
Transactions:

Load *,

RowNo() as ID,
Year(date) as Year
;

Load * Inline
[
date,amount
'1/19/2022',37.23
'2/28/2022',88.27
'3/16/2022',53.80
'4/1/2022',82.06
'5/16/2022',87.21
'6/26/2022',45.89
'7/9/2022',36.23
'8/2/2022',76.11
'9/26/2022',84.21
'10/29/2022',67.67
'1/1/2023',100.49
'2/24/2023',99.47
'3/6/2023',50.02
'4/10/2023',2.05
'5/20/2023',75.64
'6/25/2023',98.11
'7/19/2023',30.00
'9/27/2023',76.11
'10/26/2023',43.21
'11/12/2023',135.41
'1/15/2024',67.24
];
```

变量创建

加载数据并打开工作表。创建一个名为 vCutoffYear 的变量，并赋予其如下定义： 2023

表格创建

加载数据并打开工作表。创建新表并将这些字段添加为维度：

* date

* Year

* amount

接下来，在表格中添加以下每个表达式来作为维度：

* =if(Year $(vCutoffYear), 'Older', Year)

* =CalcDim(if(Year $(vCutoffYear), 'Older', Year))

表格应如下所示。

带示例结果 Qlik SenseQlik Sense 表

| date | Year | amount | if(Year $(vCutoffYear), 'Older', Year) | =CalcDim(if(Year $(vCutoffYear), 'Older', Year)) |
| --- | --- | --- | --- | --- |
| 1/19/2022 | 2022 | 37.23 | Older | Older |
| 2/28/2022 | 2022 | 88.27 | Older | Older |
| 3/16/2022 | 2022 | 53.80 | Older | Older |
| 4/1/2022 | 2022 | 82.06 | Older | Older |
| 5/16/2022 | 2022 | 87.21 | Older | Older |
| 6/26/2022 | 2022 | 45.89 | Older | Older |
| 7/9/2022 | 2022 | 36.23 | Older | Older |
| 8/2/2022 | 2022 | 76.11 | Older | Older |
| 9/26/2022 | 2022 | 84.21 | Older | Older |
| 10/29/2022 | 2022 | 67.67 | Older | Older |
| 1/1/2023 | 2023 | 100.49 | 2023 | 2023 |
| 2/24/2023 | 2023 | 99.47 | 2023 | 2023 |
| 3/6/2023 | 2023 | 50.02 | 2023 | 2023 |
| 4/10/2023 | 2023 | 2.05 | 2023 | 2023 |
| 5/20/2023 | 2023 | 75.64 | 2023 | 2023 |
| 6/25/2023 | 2023 | 98.11 | 2023 | 2023 |
| 7/19/2023 | 2023 | 30.00 | 2023 | 2023 |
| 9/27/2023 | 2023 | 76.11 | 2023 | 2023 |
| 10/26/2023 | 2023 | 43.21 | 2023 | 2023 |
| 11/12/2023 | 2023 | 135.41 | 2023 | 2023 |
| 1/15/2024 | 2024 | 67.24 | 2024 | 2024 |

比较，第 1 部分：没有 CalcDim() 的行为

在上表中，两个计算维度列之间无区别。

在 if(Year $(vCutoffYear), 'Older', Year) 表格一栏中，选择值 2023。请注意，在选择工具栏中，数值是从名为 =if(Year2023,'Older',Year) 的字段中选择的。

接下来，将 变量的定义vCutoffYear改为 2024 。请注意，虽然选择字段 =if(Year2023,'Older',Year) 是一样的，并保留了所选值 2023 ，但表格中的数据表已经发生了变化。2023 的值已变为 Older 。如果在 if(Year $(vCutoffYear), 'Older', Year) 栏中选择 Older ，则会在一个新字段中选择 Older ： =if(Year2024,'Older',Year) 。

实质上，vCutoffYear 变量的每个值都会在内部创建一个新字段。在处理并发和不断变化的选择时，这种行为可能并不可取，而且会增加数据解释的复杂性。

比较，第 2 部分：有 CalcDim() 的行为

现在您已经看到了表达式在未被 CalcDim() 包装时的行为，请清除应用程序中的所有选择。将 vCutoffYear 变量重置为 2023 的值。

在 =CalcDim(if(Year $(vCutoffYear), 'Older', Year)) 表格一栏中，选择值 2023。请注意，在选择工具栏中，该值被选为来自基础字段 Year 的值。

接下来，将 变量的定义vCutoffYear改为 2024 。选择字段 Year 是相同的，它保留了所选值 2023，表中的数据发生了变化，如图所示没有了 CalcDim()。但是，如果您现在于 Older 列中选择 =CalcDim(if(Year $(vCutoffYear), 'Older', Year)) ，则会在 2024 中选择值 Year 。

在使用 CalcDim() 封装的计算维度中进行的所有选择都将反映在从原始数据模型引用的底层字段中。这可以简化数据解释，并防止用户在使用分析内容时，在选择工具栏中出现杂乱、复杂的表达式。

* [已计算字段](https://community.qlik.com/t5/Design/Calculated-Fields/ba-p/1694383)

* [计算维度](https://help.qlik.com/zh-CN/sense/May2026/Subsystems/Hub/Content/Sense_Hub/Dimensions/calculated-dimensions.htm)