2017-01-25 30 views
0

我有Cartons表,它包含兩個datatime列 - 輸入倉庫日期和退出倉庫日期。對於我的報告,我需要計算表格,其中顯示每天結束時倉庫中有多少紙箱。我的想法是獲得輸入日期低於當前日期和退出日期高於當前日期的每個日期的紙箱數量。所以我需要把下面的sql翻譯成dax:如何使用自定義條件將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 

暗點是所有日期的表。

但是,只有使用關係才能執行dax中的所有連接。我只能交叉連接這些表並過濾結果,但是這個操作需要很長時間。我有另外的選擇嗎?

+1

遺憾的是沒有出現一個不同勢方法執行所描述的查詢,而不必在兩個表之間建立明確的關係或使用過濾的** CROSSJOIN **。如果你真的不想使用** CROSSJOIN **,我認爲你應該通過創建一個基於你的查詢邏輯的公共列來處理它。 –

回答

1

其實你可以模擬dax的關係。但是,如果我正確理解了您的問題和數據模型,則您想要查詢在給定時間仍在倉庫中的所有紙箱,對嗎?對於日期表中的每一天,您可以計算出Carton表中的行數是通過當前迭代的日期對其進行過濾。因此,此公式會計算: 對於日期表中的每一天 - VALUES('Date') - ,將計算出當前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]) 
      ) 
     ) 
     )  
    ) 

這與「Open orders」模式非常相似。檢出daxpatterns.com

如果要模擬關係,可以始終使用COUNTROWS()> 0模式作爲過濾器。

,如果你想在你的主表做一個SUM(值),但僅限於那些存在於被引用的錶行一樣 - 無關係:

CALCULATE(
    SUM('MainTable'[Value]), 
    FILTER(
    'MainTable', 
    CALCULATE(
     COUNTROWS('ReferencedTable'), 
     'ReferencedTable'[PK] = 'MainTable'[FK] 
     ) > 0 
    ) 
) 
相關問題