# alt 脚本和图表功能

alt 函数用于返回首个具有有效数表示法的参数。如果未找到此类匹配，则将返回最后一个参数。可使用任何数目的参数。

语法：

alt(expr1[ , expr2 , expr3 , ...] , else)

返回数据类型： 整数

参数

| 参数 | 描述 |
| --- | --- |
| expr1 | 用于检查有效的数字呈现形式的第一个表达式。 |
| expr2 | 用于检查有效的数字呈现形式的第二个表达式。 |
| expr3 | 用于检查有效的数字呈现形式的第三个表达式。 |
| else | 如果先前的参数都不包含有效的数字呈现形式时返回的值。 |

alt 函数通常与数字或日期解析函数一起使用。这样，Qlik Sense 就可以以优先顺序测试不同的日期格式。它还可用于处理数字表达式中的 NULL 值。

示例：图表表达式

| 示例 | 结果 |
| --- | --- |
| `alt( date#(<br>						dat , 'YYYY/MM/DD' ),` `date#( dat<br>						, 'MM/DD/YYYY' ),` `date#( dat<br>						, 'MM/DD/YY' ),` `'No valid<br>						date' )` | 此表达式将测试日期字段是否包含三个指定日期格式中的任一日期。如果是这样，它将返回包含原始字符串和有效的日期数字呈现形式的对偶值。如果未找到匹配，将返回文本`No valid date`（无任何有效的数字呈现形式）。 |
| `alt(Sales,0) + alt(Margin,0)` | 此表达式添加了字段 `Sales` 和 `Margin`，用于将所有缺失值 (NULL) 替换为 `0`。 |

## 示例 - alt 基本原理

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

#### 图表表达式

概述

数据集包含不完整的销售和预测数据。您希望用有效的替代值替换缺失的值以填补空白。

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

加载脚本包含：

* 加载到名为 `Example` 的数据表中的数据集。

* 数据表中有以下字段：

  * `ID`

  * `Sales`

  * `Forecast`

加载脚本

```
Example:
LOAD * INLINE [
ID, Sales, Forecast
1, 500, 450
2, , 300
3, 200, 250
4, , 400
5, 350,
];
```

结果

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

* `ID`

* `Sales`

* `Forecast`

创建以下度量：

* `=Sum(alt(Sales, Forecast))` 通过用有效的替换值替换缺失的值来返回有效的数字表示。

结果表

| ID | Sales | Forecast | Sum(alt(Sales, Forecast)) |
| --- | --- | --- | --- |
| Totals |  |  | 1750 |
| 1 | 500 | 450 | 500 |
| 2 |  | 300 | 300 |
| 3 | 200 | 250 | 200 |
| 4 |  | 400 | 400 |
| 5 | 350 |  | 350 |

`alt` 函数在度量计算中返回缺少 `Sales` 值的 `ID` 行的 `Forecast` 值。通过用有效的替代值替换缺失的值，您可以生成一个完全填充的数据集。

## 示例 - 使用 alt 替换缺失值

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

#### 图表表达式

概述

一家公司从多个传感器收集温度数据。您想用另一个传感器的数据替换一个传感器缺失的数据。

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

加载脚本包含：

* 加载到名为 `Example` 的数据表中的数据集。

* 数据表中有以下字段：

  * `Time`

  * `Temp_Sensor1`

  * `Temp_Sensor2`

加载脚本

```
Example:
LOAD * INLINE [
Time, Temp_Sensor1, Temp_Sensor2
08:00, 23.5, 24.0
09:00, , 23.8
10:00, 24.1,
11:00, , 24.5
12:00, 23.9, 24.1
];
```

结果

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

* `Time`

* `Temp_Sensor1`

* `Temp_Sensor2`

创建以下度量：

* `=Sum(alt(Temp_Sensor1, Temp_Sensor2))` 返回一个有效的数字表示。

结果表

| Time | Temp\_Sensor1 | Temp\_Sensor2 | Sum(alt(Temp\_Sensor1, Temp\_Sensor2)) |
| --- | --- | --- | --- |
| Totals |  |  | 119.8 |
| 08:00 | 23.5 | 24.0 | 23.5 |
| 09:00 |  | 23.8 | 23.8 |
| 10:00 | 24.1 |  | 24.1 |
| 11:00 |  | 24.5 | 24.5 |
| 12:00 | 23.9 | 24.1 | 23.9 |

查看结果，`alt` 函数已将缺失的传感器数据替换为另一个传感器的有效替代结果。这样就通过填补空白来完善了数据集。

## 示例 – alt 场景

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

#### 图表表达式

概述

此场景显示了您可使用 `alt` 函数替换缺失或空值的不同方式。

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

加载脚本包含：

* 加载到名为 `Example` 的数据表中的数据集。

* 数据表中有以下字段：

  * `ProductID`

  * `ProductName`

  * `SalesAmount`

  * `ReturnAmount`

  * `Profit`

  * `Discount`

  * `Category`

  * `Year`

  * `Region`

  * `CustomerRating`

加载脚本

```
Set NullInterpret = '';
Example:
LOAD * INLINE [
ProductID, ProductName, SalesAmount, ReturnAmount, Profit, Discount, Category, Year, Region, CustomerRating
101, "Laptop", 1200, 200, 500, , "Electronics", 2023, "North",
102, "Tablet", 800, , 300, 50, "Electronics", 2023, "South", 4
103, "Smartphone", 1500, , 600, 100, , 2022, "East", 5
104, "Printer", 400, , , 20, "Accessories", 2021, , 3
105, , 1000, 100, , 30, "Electronics", 2023, "West", 4
106, "Monitor", , 150, 250, , "Accessories", 2022, "North", 5
107, "Keyboard", 200, , 80, 5, , 2022, "South", 2
108, "Mouse", , 50, , , "Accessories", , "East",
109, , 600, , , , "Electronics", 2023, , 4
110, "Headphones", 300, 30, 100, , "Accessories", 2021, "West", 3
];
```

结果

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

* `ProductID`

创建以下计算维度：

* `=Coalesce( ProductName,  'Unknown Product')`，用于为所有没有 `ProductName` 的值的产品提供说明 `Unknown Product` 。

创建以下度量：

* `=Sum(alt(SalesAmount, ReturnAmount, Profit))`，用于在找不到 `SalesAmount` 时，返回一个有效的数字。

* `=avg(alt(CustomerRating, 3))`，用于在最初没有提供有效的标准客户评级时，返回有效的标准客户评级。

* `=Sum(alt(Discount, SalesAmount * 0.05))`，用于返回有效折扣。

* `=Sum(alt(Profit, SalesAmount * 0.1))`，用于返回有效的利润值。

* `=Sum(alt(SalesAmount, avg(TOTAL SalesAmount)))`，用于返回有效的销售值。

* `=Sum(alt(Discount, avg(TOTAL Discount)))`，用于返回有效的折扣值。

结果表

| ProductID | Coalesce( ProductName, 'Unknown Product') | Sum(alt(SalesAmount, ReturnAmount, Profit)) | avg(alt(CustomerRating, 3)) | Sum(alt(Discount, SalesAmount \* 0.05)) | Sum(alt(Profit, SalesAmount \* 0.1)) | Sum(alt(SalesAmount, avg(TOTAL SalesAmount))) | Sum(alt(Discount, avg(TOTAL Discount))) |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 总计 |  | 6200 | 3.6 | 310 | 2030 | 7500 | 410 |
| 101 | Laptop | 1200 | 3 | 60 | 500 | 1200 | 41 |
| 102 | Tablet | 800 | 4 | 50 | 300 | 500 | 50 |
| 103 | Smartphone | 1500 | 5 | 100 | 600 | 800 | 100 |
| 104 | Printer | 400 | 3 | 20 | 40 | 400 | 20 |
| 105 | Unknown Product | 1000 | 4 | 30 | 100 | 1000 | 30 |
| 106 | 监视器 | 150 | 5 | 0 | 250 | 750 | 41 |
| 107 | Keyboard | 200 | 2 | 5 | 80 | 200 | 5 |
| 108 | Mouse | 50 | 3 | 0 | 0 | 750 | 41 |
| 109 | Unknown Product | 600 | 4 | 30 | 60 | 600 | 41 |
| 110 | Headphones | 300 | 3 | 15 | 100 | 300 | 41 |

`alt` 函数确保在值缺失时，可以计算并返回替代值。请关注以下结果：

* 第 2 列使用 `Coalesce` 函数返回所有空值的值 `Unknown Product`。不能使用 `Alt` 函数，因为它只适用于数值。

* 第 3 列返回 `SalesAmount` 的值。如果找不到值，则返回 `ReturnAmount` 值。如果找不到 `ReturnAmount` 值，则返回 `Profit` 值。这有助于确保列在 `SalesAmount` 没有值的情况下填充值。

* 第 4 列返回 `CustomerRating`。如果找不到值，则默认值为 `3`。例如，产品 `Laptop` 没有客户评分，因此返回了 `3`。然后，该度量计算该列的平均值。

* 第 5 列返回折扣值。如果没有可用值，则计算为 `SalesAmount` 值的 5%。

* 第 6 列返回 `Profit` 值。若没有可用值，则返回 `SalesAmount` 的 10%。

* 第 7 列返回 `SalesAmount`。如果没有提供值，则返回整个数据集的平均 `SalesAmount`。例如，产品 `Monitor` 和 `Mouse` 没有 `SalesAmount` 的值，因此两者都返回 `750`，这是所有 `SalesAmount` 值的平均值。

* 第 8 列返回 `Discount` 值。如果没有找到值，则系统计算并返回整个数据集的平均折扣。