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 

은 이제 나는이 치수 큐브 있다고 가정 해 봅시다

날짜 (년, 월, 일) - 날짜가 항상 달의 1 일입니다 영업 사원

사실 테이블 세 개의 열이 - 날짜, 영업 담당자, TotalSales - 즉, 사람이 그 달의 판매 금액을.

저는 매월 상위 5 명의 판매 직원과 각 TotalSales를보고 싶습니다. 상위 5 명의 판매원은 한 달에서 다음 달까지 다를 수 있습니다. 무엇 난 후하는 열을 날짜와 행에 영업 사원 및 TotalSales을두고 쿼리입니다

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] 
    ) 

:이처럼 보이는 쿼리를 사용하여, 한 달 동안 결과를 얻을 수 있어요

.

저는 매월, 매달, 상위 5 명의 판매원과 판매량을보고 싶습니다.

이렇게하면 매년 판매 직원을 필터링하거나 그룹화하지 않는 것입니다 (각 날짜별로 상위 5 개를 얻음). 반환 된 값은 모든 곳에서 매우 낮고 null 값을 포함합니다. 특히 SalesSerson 목록은 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 블록으로 조심해야합니다. 이것은 세트가 평가 될 때/변경되고 스코프를 변경하고 결과를 변경하는 것처럼 보입니다.

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 
관련 문제