我有纸箱表,其中包含两个数据时间列 - 输入仓库日期和退出仓库日期。对于我的报告,我需要计算表格,该表格显示每天结束时仓库中有多少个纸箱。我的想法是获得每个日期的纸箱数量,其输入日期低于当前日期,退出日期高于当前日期。所以我需要将以下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是包含所有日期的表。
但是dax中的所有连接只能使用关系来执行。我只能对这些表进行交叉连接并过滤结果,但这个操作需要花费很多时间。我有其他选择吗?
答案 0 :(得分:3)
实际上你可以模拟与dax的关系。但是,如果我正确理解您的问题和datamodell,您想查询在给定时间仍在仓库中的所有纸箱,对吧?对于Date表中的每一天,您可以通过在当前迭代日过滤它来计算Carton表中的行数。所以这个公式计算: 对于日期表中的每一天 - 值('日期') - ,将计算当前Cartons表中使用了一些过滤的行数 - COUNTROWS(' Cartons') - 。过滤的工作方式如下:在当天的当前值 - 作为C#中的foreach - 它将检查Cartons表中存在多少行,其中退出日期高于或等于当前迭代中的日期值,输入日期低于当前日期,或者它是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])
)
)
)
)
这与&#34; Open orders&#34;非常相似。图案。查看daxpatterns.com
如果您想模拟关系,可以随时使用COUNTROWS()&gt; 0模式作为过滤器。
就像你想在主表上执行SUM(Value)一样,但仅对于Referenced表中存在的那些行 - 没有关系:
CALCULATE(
SUM('MainTable'[Value]),
FILTER(
'MainTable',
CALCULATE(
COUNTROWS('ReferencedTable'),
'ReferencedTable'[PK] = 'MainTable'[FK]
) > 0
)
)