2012-04-03 1 views
0

の総売上高によって人々が、私のキューブでMDXで:MDX - トップX販売私はこれをやろうとしている各日付

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 

だが、私はこれらの寸法を持つキューブがあるとしましょう

日付(年、月、日) - 日、販売員、TotalSales - - すなわち、人はその月に販売量日付が常に月 の第一である販売員

は、ファクトテーブルには、3つの列があります。

毎月、上位5人の販売担当者とそれぞれのTotalSalesを見たいと思っています。上位5人の販売員は、1か月ごとに異なる場合があります。

私はこのようなクエリを使用して、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] 
    ) 

私は何をした後だと、行に日付や販売員を置くクエリで、列にTotalSales 。

私は毎月、毎月、上位5人の販売員、そしてどれくらい売れたかを見たいと思っています。

このようにしようとすると、各日付ごとに販売人をフィルタリング/グループ化するようには見えません(各日付の上位5個を取得)。返される値はすべての場所にあり、非常に低い値とNULL値が含まれます。特に、SalesPersonのリストは、TotalSalesが大きく異なるにもかかわらず、日付ごとに同じです。

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

[日付] [階層] "サブセット" 内のすべてのものは、現在の[日付]によってフィルタリングされる必要があると見えますが、CURRENTMEMBERを使用してCROSSJOIN /軸エラーを与える:。。

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 

私は運がない最後のクエリのいくつかのバリエーションを試しました。

答えがMDXの新しいものにも役立つことを願っています。

答えて

0

私は最終的に私が探していたことをする方法を見つけました。このソリューションはGenerate関数を使用して回転し、MSDNの基本的な例から始めて、私の立方体の寸法と寸法を修正することで、私は正しい方向に向かいました。 http://msdn.microsoft.com/en-us/library/ms145526.aspx

から

は、より良い方法はありますか?

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

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 
関連する問題