📅  最后修改于: 2023-12-03 15:14:37.561000             🧑  作者: Mango
在使用 Power BI 或者 Excel 中,经常需要从一个表中过滤出满足某些条件的数据。如果这些条件涉及到另一个表,我们可以使用 DAX 来实现。
DAX 中有一个 IN 函数,可以用来检查一个值是否存在于一个集合中。语法为:
IN(<value>, <value1>, [<value2>],...)
其中,<value>
是待检查的值,<value1>
、<value2>
等是可能的值。
如果 <value>
存在于集合中,则返回 TRUE
,否则返回 FALSE
。
那么,如何从另一个表中获取集合呢?我们可以使用 LOOKUPVALUE 函数。
LOOKUPVALUE(<column>, <search_column>, <value>)
其中,<column>
是待获取的列,<search_column>
是用于查找的列,<value>
是用于查找的值。
这个函数的作用是,在查找到 <search_column>
中包含 <value>
的行之后,返回该行 <column>
列的值。
因此,我们可以将 LOOKUPVALUE
函数的结果作为 IN 函数的参数,来实现从另一个表中获取集合的功能。
下面是一个 TypeScript 代码示例,用来检查一个用户是否购买了某个产品。
import * as powerbi from "powerbi-visuals-api";
function isProductPurchased(product: string, userId: number): boolean {
const productTable: powerbi DataViewTable = this.getProductsTable();
const orderTable: powerbi DataViewTable = this.getOrdersTable();
const purchasedUsers: number[] = [];
for (let i = 0; i < productTable.rows.length; i++) {
const productName = productTable.rows[i].values[0].toString();
if (productName === product) {
const productId = productTable.rows[i].values[1].toString();
for (let j = 0; j < orderTable.rows.length; j++) {
const orderId = orderTable.rows[j].values[1].toString();
if (orderId === productId) {
purchasedUsers.push(orderTable.rows[j].values[0] as number);
}
}
}
}
return purchasedUsers.includes(userId);
}
这段示例代码使用 getProductsTable()
和 getOrdersTable()
方法获取产品和订单两个表的数据,并通过 for
循环逐行匹配。当产品名称匹配成功时,获取产品的 ID,并在订单表中查找是否有该产品对应的订单。如果找到了,就将订单的用户 ID 加入 purchasedUsers
数组中。
最后,我们使用 includes()
方法,来检查当前用户 ID 是否在 purchasedUsers
数组中。如果在,则返回 TRUE
,否则返回 FALSE
。