0

ファクト テーブル内の一意のファクトのみをカウントする計算メジャーを作成する方法を見つけようとしています。私のファクト テーブルは基本的に、歴史的な観点からイベントを格納します。しかし、冗長なイベントを除外する手段が必要です。
販売を例として使用する (OLAP に関するすべての資料では、常に販売を例として使用するため):

ファクト テーブルには、販売の EVENTS が格納されます。販売が最初に行われると、ファクト テーブルの列である一意の販売参照があります。ただし、独自のセールは修正 (アイテムの追加または返品) または完全にキャンセルすることができます。ファクト テーブルは、販売に対するこれらの変更を異なる行として格納します。

SSAS を使用してカウント メジャーを作成すると、すべての販売イベントのカウントが取得されます。これは、変更が加えられるたびに、一意の販売が複数回カウントされることを意味します (一部のレポートではこれが望ましい)。ただし、イベントではなく、一意の販売参照をカウントするだけでなく、一意の販売数を生成するメジャーも必要です。ユーザーが日付でフィルタリングすると、その日付にまだ存在する一意の売上が表示されます (その日付までに売上がキャンセルされた場合、カウントにまったく表示されない場合)。

MDX/SSAS でこれを行うにはどうすればよいですか? 時間ディメンションに基づいて販売に対する最新の変更を見つけるクエリのサブセットからカウント クエリを機能させる必要があるようです。SQL では次のようになります

SELECT COUNT(*) FROM SalesFacts FACT1 WHERE Event <> 'Cancelled' AND
Timestamp = (SELECT MAX(Timestamp) FROM SalesFact FACT2 WHERE FACT1.SalesRef=FACT2.SalesRef)

4

3 に答える 3

0

簡単な答えは、ファクト ビュー/dsv クエリに「販売数」列を配置することです。これは、「最初の」イベントには 1、イベントの後続のすべてのリビジョンにはゼロ、イベントがキャンセルされた場合は -1 を提供します。 . この「ジャーナリング」アプローチは、インクリメンタル ファクト テーブル ロードでうまく機能します。

おそらく長期的にはより役立つ別のアプローチは、イベント ディメンションを使用することです。これにより、ファクト テーブル内の特定のメジャーに対して、そのディメンション内の空でないメンバーの数である計算されたメジャーを公開できます。ただし、販売の場合、これは本質的に縮退したディメンション (ファクト テーブルに基づくディメンション) であり、非常に大きくなる可能性があります。これは不適切な場合があります。

場合によっては、要件がより複雑になることがあります。時間ごとにスライスする場合、後でキャンセルされたとしても、当時存在していたすべての個別のイベントを知る必要がありますか? それはややこしくなり始めます: Chris Webb のブログに最近の投稿があり、1 つの (やや難しい) 解決策について語っています。

http://cwebbbi.wordpress.com/2011/01/22/solving-the-events-in-progress-problem-in-mdx-part-2role-playing-measure-groups/

于 2011-03-24T08:46:07.687 に答える
0

投稿されたクエリは、おそらく次のように書き直される可能性があります。

SELECT COUNT(DISTINCT SalesRef)
FROM SalesFacts
WHERE Event <> 'Cancelled'
于 2011-03-17T13:03:58.917 に答える
0

SSAS で、一意のトランザクション ID (販売番号または注文番号) に基づくメジャーを作成し、プロパティ ウィンドウでそのメジャーを 'DistinctCount' 集計関数にします。

これで、どのディメンション スライスの下にあるかに関係なく、個別の注文番号をカウントする必要があります。

于 2011-03-17T10:08:41.940 に答える