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