如何使用自定义条件连接dax中的两个表
How to joint two tables in dax using custom condition
我有 Cartons table,其中包含两个数据时间列 - 入库日期和出库日期。对于我的报告,我需要计算 table,它显示每天结束时仓库中有多少纸箱。我的想法是获取每个日期的纸箱数量,这些日期的进入日期低于当前日期,退出日期高于当前日期。所以我需要将以下 sql 翻译成 dax:
SELECT d.date, COUNT(c.Id) AS 'Count of cartons' FROM #dim d
INNER JOIN Inventory.Cartons c on d.date between c.EnteringWarehouseTime and c.ExitingWarehouseTime
GROUP BY d.date
ORDER By d.date
dim 是 table 所有日期。
但是 dax 中的所有连接都只能使用关系来执行。我只能对这些table进行交叉连接和过滤结果,但是这个操作会花费很多时间。我还有其他选择吗?
其实可以用dax模拟关系。但是,如果我对你的问题和数据模型的理解正确,你想查询在给定时间仍在仓库中的所有纸箱,对吗?对于 Date table 中的每一天,您可以通过按当前迭代的 Day 进行过滤来计算 Carton table 中的行数。所以这个公式计算:
对于日期 table - VALUES('Date') - 中的每一天,将计算 Cartons table 中有多少行使用了一些过滤 - COUNTROWS('Cartons') -。过滤是这样工作的:在一天的当前值上——想想 C# 中的 foreach——它将检查纸箱 table 中存在的行数,它的退出日期高于或等于当前日期迭代中的日期值,并且输入日期低于当前日期,或者它是 BLANK() - 所以仍在仓库中。
CALCULATETABLE(
ADDCOLUMNS(
VALUES('Date'),
"Cartons",
CALCULATE(
COUNTROWS('Cartons'),
FILTER(
'Cartons',
'Cartons'[EnteringWarehouseTime] <= 'Date'[Date]
),
FILTER(
'Cartons',
OR('Cartons'[ExitingWarehouseTime] >= 'Date'[Date],ISBLANK('Cartons'[ExitingWarehouseTime])
)
)
)
)
这与 "Open orders" 模式非常相似。查看 daxpatterns.com
如果您想模拟一种关系,您始终可以使用 COUNTROWS() > 0 模式作为过滤器。
就像你想在你的主 table 上做一个 SUM(Value),但只针对引用 table 中存在的那些行 - 没有关系:
CALCULATE(
SUM('MainTable'[Value]),
FILTER(
'MainTable',
CALCULATE(
COUNTROWS('ReferencedTable'),
'ReferencedTable'[PK] = 'MainTable'[FK]
) > 0
)
)
我有 Cartons table,其中包含两个数据时间列 - 入库日期和出库日期。对于我的报告,我需要计算 table,它显示每天结束时仓库中有多少纸箱。我的想法是获取每个日期的纸箱数量,这些日期的进入日期低于当前日期,退出日期高于当前日期。所以我需要将以下 sql 翻译成 dax:
SELECT d.date, COUNT(c.Id) AS 'Count of cartons' FROM #dim d
INNER JOIN Inventory.Cartons c on d.date between c.EnteringWarehouseTime and c.ExitingWarehouseTime
GROUP BY d.date
ORDER By d.date
dim 是 table 所有日期。
但是 dax 中的所有连接都只能使用关系来执行。我只能对这些table进行交叉连接和过滤结果,但是这个操作会花费很多时间。我还有其他选择吗?
其实可以用dax模拟关系。但是,如果我对你的问题和数据模型的理解正确,你想查询在给定时间仍在仓库中的所有纸箱,对吗?对于 Date table 中的每一天,您可以通过按当前迭代的 Day 进行过滤来计算 Carton table 中的行数。所以这个公式计算: 对于日期 table - VALUES('Date') - 中的每一天,将计算 Cartons table 中有多少行使用了一些过滤 - COUNTROWS('Cartons') -。过滤是这样工作的:在一天的当前值上——想想 C# 中的 foreach——它将检查纸箱 table 中存在的行数,它的退出日期高于或等于当前日期迭代中的日期值,并且输入日期低于当前日期,或者它是 BLANK() - 所以仍在仓库中。
CALCULATETABLE(
ADDCOLUMNS(
VALUES('Date'),
"Cartons",
CALCULATE(
COUNTROWS('Cartons'),
FILTER(
'Cartons',
'Cartons'[EnteringWarehouseTime] <= 'Date'[Date]
),
FILTER(
'Cartons',
OR('Cartons'[ExitingWarehouseTime] >= 'Date'[Date],ISBLANK('Cartons'[ExitingWarehouseTime])
)
)
)
)
这与 "Open orders" 模式非常相似。查看 daxpatterns.com
如果您想模拟一种关系,您始终可以使用 COUNTROWS() > 0 模式作为过滤器。
就像你想在你的主 table 上做一个 SUM(Value),但只针对引用 table 中存在的那些行 - 没有关系:
CALCULATE(
SUM('MainTable'[Value]),
FILTER(
'MainTable',
CALCULATE(
COUNTROWS('ReferencedTable'),
'ReferencedTable'[PK] = 'MainTable'[FK]
) > 0
)
)