2016-01-21 72 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] 

希望工程。