如何使用自定义条件在dax中联合两个表

时间:2017-01-25 08:22:43

标签: sql tsql reporting-services ssas dax

我有纸箱表,其中包含两个数据时间列 - 输入仓库日期和退出仓库日期。对于我的报告,我需要计算表格,该表格显示每天结束时仓库中有多少个纸箱。我的想法是获得每个日期的纸箱数量,其输入日期低于当前日期,退出日期高于当前日期。所以我需要将以下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中的所有连接只能使用关系来执行。我只能对这些表进行交叉连接并过滤结果,但这个操作需要花费很多时间。我有其他选择吗?

1 个答案:

答案 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
   )
)