[英]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.