0

私はこれをやろうとしていますが、キューブに MDX を使用しています:

select
    *
from
(
    select 
        Date, SalesPerson, TotalSales, row_number() over(partition by Date order by TotalSales desc) as Num
    from SalesFact as ms
) as x
where
    Num < 5
order by
    Date, SalesPerson, Num desc

これらの次元の立方体があるとしましょう:

日付 (年、月、日) - 日付は常に月の 1 日です

ファクト テーブルには、Date、SalesPerson、TotalSales の 3 つの列があります。つまり、その人がその月に販売した金額です。

毎月、上位 5 人の営業担当者と、それぞれの TotalSales を表示したいと考えています。上位 5 人の営業担当者は、月ごとに異なる可能性があります。

次のようなクエリを使用して、1 か月間の結果を取得できます。

select
      [Measures].[TotalSales] on columns,
      (
            subset
            (
                  order
                  (
                        [SalesPerson].children,
                        [Measures].[TotalSales], 
                        bdesc
                  ),
                  0,
                  5
            )
      ) on rows
from
      Hypercube
where 
      (
            [Date].[Date].&[2009-03-01T00:00:00]
      )

私が求めているのは、Date と SalesPerson を行に配置し、TotalSales を列に配置するクエリです。

毎月、各月の上位 5 人の営業担当者と、その売上高を時系列で確認したいと考えています。

このようにしようとすると、日付ごとに営業担当者をフィルタリング/グループ化するようには見えません(日付ごとにトップ5を取得します)。返される値はいたるところにあり、非常に低い値や null 値が含まれています。特に、TotalSales は大きく異なりますが、SalesPerson リストは各日付で同じです。

select
    [Measures].[TotalSales] on columns,
    (
        [Date].[Hierarchy].[Date].members,
        subset
        (
            order
            (
                [SalesPerson].children,
                [Measures].[TotalSales], 
                bdesc
            ),
            0,
            5
        )
    ) on rows
from
    Hypercube

「サブセット」内のすべてを現在の [Date].[Hierarchy].[Date] でフィルタリングする必要があるようですが、CurrentMember を使用すると crossjoin / axis エラーが発生します。

select
    [Measures].[TotalSales] on columns,
    (
        [Date].[Hierarchy].[Date].members,
        subset
        (
            order
            (
                ([SalesPerson].children, [Date].[Hierarchy].CurrentMember),
                [Measures].[TotalSales], 
                bdesc
            ),
            0,
            5
        )
    ) on rows
from
    Hypercube

エラー: クエリを実行しています... クエリ (3, 2) 階層階層が Crossjoin 関数で複数回使用されています。

実行完了

最後のクエリのバリエーションをいくつか試しましたが、うまくいきませんでした。

この回答が、MDX を初めて使用する他のユーザーにも役立つことを願っています。

4

1 に答える 1

0

私は最終的に私が探していたものを行う方法を見つけました。ソリューションは、Generate関数の使用を中心に展開し、MSDNの基本的な例から始めて、ディメンションとメジャーをキューブ内のものになるように変更することで、正しい方向に進むことができました。

http://msdn.microsoft.com/en-us/library/ms145526.aspxから

もっと良い方法はありますか?

また、セットをwithブロックにリファクタリングしようとすることに注意してください。これは、セットが評価/スコープを変更すると変更されるようで、結果が変更されます。

with

set
Dates as
{
    [Date].[Hierarchy].[Date].&[2009-02-01T00:00:00],
    [Date].[Hierarchy].[Date].&[2009-03-01T00:00:00],
    [Date].[Hierarchy].[Date].&[2009-04-01T00:00:00]
}

select
    Measures.[TotalSales]
    on columns,
    generate
    (
        Dates,
        topcount
        (
            [Date].Hierarchy.CurrentMember
            *
            [SalesPerson].Children,
            5,
            Measures.[TotalSales]
        )
    )
    on rows
from
    Hypercube
于 2012-04-05T18:30:59.477 に答える