2016-01-21 70 views
1

我有奇怪的问题,我试图解决。我的事实表看起来如下:MDX使不同值的总和的计算度量

CaseID | ClientID | PaymentDate|ToPay | Paid 
1  |  1 | 2015-01-01 |1000 |100 
1  |  1 | 2015-02-01 |1000 |200 
1  |  1 | 2015-03-01 |1000 |300 
2  |  1 | 2015-01-01 |2000 |100 
2  |  1 | 2015-02-01 |2000 |400 
2  |  1 | 2015-03-01 |2000 |150 

我试图做的是创造2项措施:
Sum(ToPay)
Sum(Paid)

问题是什么?

在结果集,我应该得到这样的值: 客户:1有偿:3000,支付:1250

这意味着总和(ToPay)将被计算为特定的客户和案例不同的值。

可以在MDX中创建这样的查询吗?如果是,那么如何?

+0

SSAS Multidimensional or Tabular? – GregGalloway

+0

计算不同的ToPay值似乎非常危险。客户不可能欠两个单独的$ 1000付款吗?你如何区分这两种单独的付款? – GregGalloway

+0

这是但我们将有两个不同的CaseID的。业务案例与租购相关。一个客户可能有两个信用点,我需要知道他已经偿还了多少。我想将它放在一张表中 - 现在我在DSV中创建了查询以获取不同的值,但我很确定可以在MDX中解决它。 –

回答

0

好了 - 我想你的情况跟MS立方体AdvWrks

这里的模型是所有相加的情况:

WITH 
    MEMBER [Date].[Calendar].[All].[x] AS 100 
    MEMBER [Date].[Calendar].[All].[y] AS 200 
    MEMBER [Date].[Calendar].[All].[z] AS 200 
    SET [blah] AS 
    { 
     [x] 
    ,[y] 
    ,[z] 
    } 
    MEMBER [Measures].[xx] AS 
    Sum 
    (
     [blah] 
    ,[Measures].[Internet Sales Amount] 
    ) 
SELECT 
    {[Measures].[xx]} ON 0 
FROM [Adventure Works]; 

结果是500

拔出总和我已经使用Filter,这取决于设置的顺序,所以也需要使用Order函数:

WITH 
    MEMBER [Date].[Calendar].[All].[a] AS 100 
    MEMBER [Date].[Calendar].[All].[x] AS 50 
    MEMBER [Date].[Calendar].[All].[y] AS 200 
    MEMBER [Date].[Calendar].[All].[z] AS 200 
    SET [blah] AS 
    { 
     [a] 
    ,[x] 
    ,[y] 
    ,[z] 
    } 
    MEMBER [Measures].[xx] AS 
    Sum 
    (
     Filter 
     (
     Order 
     (
      [blah] 
     ,[Measures].[Internet Sales Amount] 
     ) AS x 
     , 
      (
      x.CurrentMember 
      ,[Measures].[Internet Sales Amount] 
     ) 
     <> 
      (
      x.Item(
      x.CurrentOrdinal) 
      ,[Measures].[Internet Sales Amount] 
     ) 
    ) 
    ,[Measures].[Internet Sales Amount] 
    ) 
SELECT 
    {[Measures].[xx]} ON 0 
FROM [Adventure Works]; 

结果是350

+0

@GregGalloway我猜测必须有一个更简单的方法! ...? – whytheq

0

如果你采取格雷格·加洛韦的建议,非常适合你。否则,另一个好的MDX挑战!

以下是您可以做的事情。

首先按照自然顺序排列集合。

接下来,仅针对集合中的当前成员与先前成员不相同或者如果它是第一个成员(在这种情况下当前总是不相同的情况下)的度量[To Pay]如以前的成员)

with set [Client&Case] as 
order 
    (
     [Fact].[ClientID].[All].children * [Fact].[CaseID].[All].children, 
     [Fact].[ClientID].currentmember.name + "" + [Fact].[CaseID].currentmember.name 
    ) 


member measures.[Actual - To Pay] as 
sum 
    (
    [Client&Case], 
     iif 
     ( 
     not([Client&Case].item([Client&Case].currentordinal-1) is [Client&Case].item([Client&Case].currentordinal-2)) 
      --current not same not as previous 
     or [Client&Case].currentordinal = 1 --the first member! 
     ,[Measures].[To Pay] 
     ,0 
    ) 
    ) 

select 
{measures.[Paid], measures.[Actual - To Pay]} on 0, 
[Client&Case] on 1 
from [Your Cube] 

从Adventure Works公司:

with set [Category&Country] as 
    { 
    ([Product].[Category].&[3], [Customer].[Customer Geography].[Country].&[Australia]), 
    ([Product].[Category].&[3], [Customer].[Customer Geography].[Country].&[Australia]), 
    ([Product].[Category].&[4], [Customer].[Customer Geography].[Country].&[Australia]), 
    ([Product].[Category].&[4], [Customer].[Customer Geography].[Country].&[Australia]), 
    ([Product].[Category].&[4], [Customer].[Customer Geography].[Country].&[Australia]) 
    } 

    member measures.TotalInternetSales as 
    sum([Category&Country],[Measures].[Internet Sales Amount]) 

    member measures.[ActualInternetSales] as 
    sum 
     (
     [Category&Country], 
      iif 
      (   
      not([Category&Country].item([Category&Country].currentordinal-1) is [Category&Country].item([Category&Country].currentordinal-2)) 
      or [Category&Country].currentordinal = 1 
      ,([Category&Country].currentmember, [Measures].[Internet Sales Amount]) 
      ,0 
     ) 
     ) 

    select 
    {measures.TotalInternetSales, measures.[ActualInternetSales]} on 0 
    from [Adventure Works] 

希望工程。