# 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-TW/sense/May2026/Subsystems/Hub/Content/Sense_Hub/Dimensions/calculated-dimensions.htm)