簡體   English   中英

MDX計算得出的度量,得出不同值的總和

[英]MDX Calculated measure which makes sum of distinct values

我有一個奇怪的問題要解決。 我的事實表如下所示:

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

這意味着sum(ToPay)將被計算為特定客戶和案例的不同值。

是否可以在MDX創建這樣的查詢? 如果是,那怎么辦?

好的-我嘗試使用MS多維數據集AdvWrks對您的情況進行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。

如果您接受Greg Galloway的建議,那對您非常有用。 否則,另一個很好的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]

從冒險作品:

    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]

希望它能工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM