如何使用自定义条件连接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
   )
)