3

次のように簡略化されたテーブルがあります-FactSales:

Date      Reference      Amount     TypeId     Seller
1/10/2013 A1             100        1          100
3/10/2013 A2             200        1          200
5/10/2013 A1             -100       2          100

DimType の外部キー テーブル - 1 は販売、2 は払い戻し、および DimSellers です。DimDate テーブルなどもあります。

基本的に、これはすべて SSAS キューブに処理され、売上高の合計ではなく、売上の合計数をカウントする MDX クエリを作成しようとしています。列は販売者を表し、行は過去 12 か月から現在までの月を表す必要があります。販売者を列に、月を行としてカウントを正常に実行できますが、販売のタイプ 1 でのみフィルタリングします。

私が少し引っかかっている部分は、販売が同じ月に払い戻されなかった場合 (タイプ 2)、販売はその月の販売としてのみカウントされるべきであるということです。タイプ 1 の販売後の翌月に返金された場合は、カウントする必要があります。販売と同じ月に返金された場合、販売としてカウントされません。

期待される結果は、私の例からのものでなければなりません。A1 は販売されたのと同じ月に払い戻しが行われたため、10 月の販売としてカウントされません。

         Seller 100.     Seller 200.   ...
Oct 13.    0.                1
Sept 13 ...
Aug 13 ...
...
Nov 12 ...

どんな助けでも大歓迎です。

4

1 に答える 1

2

キューブ内のオブジェクトが次のように命名されていると仮定します。

  • 販売者属性: [DimSeller].[Seller],
  • 日付階層:月を含む[DimTime].[Date]レベルで、Month
  • type 属性の階層:[DimType].[Type]キー 1 と 2 で、
  • Amount列に基づくメジャーの名前Amountは 、
  • さまざまな販売イベントを識別する属性階層があります[Sale].[SaleId](売り手ではなく販売イベントをカウントしたいので必要です)。
  • キューブの名前はCubeNameです。

次に、次の MDX が必要なものを提供するはずです。

WITH Member [Measures].[SellerCount] AS
     Filter( [Sale].[SaleId].[SaleId].Members * { [DimType].[Type].&[1] }
             (
              [DimSeller].[Seller].CurrentMember,
              [DimTime].[Date].CurrentMember,
              [DimType].[Type].&[2], Measures.Amount
             ) = 0
           ).Count
SELECT [DimSeller].[Seller].[Seller].Members
       ON COLUMNS,
       [DimTime].[Date].[Month].Members
       ON ROWS
  FROM [CubeName]
 WHERE [Measures].[SellerCount]

これは、正の払い戻しがないことを前提としています。つまり、金額が 0 の払い戻しはカウントされません。また、1 か月に複数の (場合によっては負と正の) 払い戻しの合計が 0 になることはあり得ません。

ただし、属性を介してこれを実装することもできます。たとえば、「同月に返金あり」などの属性を使用し、ファクト テーブルのカウントと同じように「販売イベント数」というメジャーを想定すると、ユーザーは多かれ少なかれすべてのクライアント ツールでこれを利用できます。必要な句がないため、キューブにアクセスできますWITH。MDX は単純に次のようになります。

SELECT [DimSeller].[Seller].[Seller].Members
       ON COLUMNS,
       [DimTime].[Date].[Month].Members
       ON ROWS
  FROM [CubeName]
 WHERE (
        [Measures].[Sales Event Count],
        [Sales].[Has Refund In Same Month].[Yes]
       )

これを実装するには、DSV の名前付き列として列を追加するか、次の SQL コードを使用してテーブルのビューに列を追加します。

CASE WHEN EXISTS ( SELECT 1
                     FROM table e
                    WHERE DatePart(Month, e.Date) = DatePart(Month, mainTable.Date)
                      AND DatePart(Year, e.Date) = DatePart(Year, mainTable.Date)
                      AND e.Seller = mainTable.Seller
                 )
          THEN 'Yes'
          ELSE 'No'
END
于 2013-11-14T20:38:59.943 に答える