2017-01-25 4 views
0

私はカートンテーブルを持っています。このテーブルには、倉庫の日付と倉庫の日付の入力という2つのデータ列があります。私のレポートでは、毎日の終わりに倉庫にカートンがいくつあるかを示す表を計算する必要があります。私の考えは、現在の日付よりも低い日付と現在の日付よりも高い終了日を入力する各日付のカートンの数を取得しました。ですから、次のSQLをdaxに変換する必要があります。カスタム条件を使用してdaxで2つのテーブルを結合する方法

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

は残念ながらに切り抜いたアプローチがあります:関係のない - あなたがあなたのメインテーブルの上にSUM(バリュー)をやりたいんが、唯一の参照されるテーブルに存在するそれらの行のための場合と同様に

両方のテーブル間の明示的な関係を持たずに、またはフィルタされた** CROSSJOIN **を使用して、記述したクエリを実行します。 ** CROSSJOIN **を実際に使用したくない場合は、クエリのロジックに基づいて共通の列を作成してソースで処理する必要があります。 –

答えて

1

実際には、daxとの関係をシミュレートできます。しかし、あなたの質問とデータモデルが正しく理解されていれば、特定の時間に倉庫に残っているカートンをすべて照会したいと思うでしょうか? Dateテーブルの各日に対して、Cartonテーブルの現在の反復日でフィルタリングする行数を計算できます。したがって、この数式は次のように計算されます。 日付表の各日 - VALUES( 'Date') - は、現在のCartons表のいくつの行がいくつかのフィルタリングを使用しているかを計算します - COUNTROWS( 'Cartons') - 。フィルタリングは次のように動作します:Dayの現在の値 - C#でforeachとして考える - カートンテーブルにある行の数がチェックされます。Exiting dateは現在のDateの値よりも大きいか等しい反復、および入力の日付が現在の日付よりも低いか、または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]) 
      ) 
     ) 
     )  
    ) 

これは、 "オーダーオーダー"パターンと非常によく似ています。チェックアウトdaxpatterns.com

リレーションシップをシミュレートする場合は、常にCOUNTROWS()> 0パターンをフィルタとして使用できます。

CALCULATE(
    SUM('MainTable'[Value]), 
    FILTER(
    'MainTable', 
    CALCULATE(
     COUNTROWS('ReferencedTable'), 
     'ReferencedTable'[PK] = 'MainTable'[FK] 
     ) > 0 
    ) 
) 
関連する問題