我有一个mdx查询,返回“productCode”和“总销售额的产品份额”。我还需要在“总销售额的产品份额”(Decs)中对该查询进行排序 所以我提出了以下MDX查询
WITH MEMBER [Measures].[Contribution] AS
Format(
IIF(
IsEmpty([Measures].[Detail_Net_Sales]),
0,
[Measures].[Detail_Net_Sales]
)/
[Measures].[SumTotalPayable]
)
SELECT
{[Measures].[Contribution]}
ON COLUMNS,
Order(
[DIMProduct].[ProductCode].[ProductCode].AllMEMBERS,
[Measures].[Contribution],
BDESC
)
ON ROWS
FROM [Model] }
问题在于我还希望为每个产品代码提供以前的贡献 我写下了这样的事情:
WITH MEMBER [Measures].[Contribution] AS
Format(iif(IsEmpty([Measures].[Detail_Net_Sales]),0,[Measures] [Detail_Net_Sales])/[Measures].[SumTotalPayable] )
MEMBER [Measures].[test]
AS
([Measures].[Contribution], [DIMProduct].[ProductCode].CurrentMember.PrevMember)
SELECT { [Measures].[Contribution] ,[Measures].[test]} ON COLUMNS
, Order([DIMProduct].[ProductCode].[ProductCode].AllMEMBERS ,[Measures]. [Contribution],BDESC)ON ROWS
FROM [Model]
但上面的代码将返回之前的贡献而没有欲望订单。 你有什么想法我能解决这个问题吗?
修改: 我希望前一行的贡献基于我的排序,并且还具有基于我之前排序的测试度量,如下表所示:
ProductCode Contribution Test
----------- ------------ ----
123 17.56 null
332 17.30 17.56
245 16 17.30
656 15.90 16
但我得到的是这样的:
ProductCode Contribution Test
----------- ------------ ----
123 17.56 17.30
332 17.30 16
245 16 Null
656 15.90 17.30
答案 0 :(得分:1)
WITH MEMBER [Measures].[Contribution] AS
Format(
IIF(
IsEmpty([Measures].[Detail_Net_Sales]),
0,
[Measures].[Detail_Net_Sales]
)/
[Measures].[SumTotalPayable]
)
SET SortedProducts AS
Order(
[DIMProduct].[ProductCode].[ProductCode].AllMEMBERS,
[Measures].[Contribution],
BDESC
)
MEMBER [Measures].[PrevContribution] AS
(SortedProducts.Item(
Rank([DIMProduct].[ProductCode].CurrentMember, SortedProducts) - 2)
.Item(0),
[Measures].[Contribution])
SELECT
{[Measures].[Contribution], [Measures].[PrevContribution]}
ON COLUMNS,
SortedProducts
ON ROWS
FROM [Model] }
您对test
度量的定义使用多维数据集中定义的成员顺序(如果您没有定义自定义顺序,则按字母顺序排列)。但是您需要Contribution
的顺序,因此我将其定义为包含此顺序成员的命名集。然后我误用了Rank
函数,它给出了集合中元组的位置。由于第一个成员的等级是1,我使用Item
函数来获取集合中的元组 - 它开始将元组编号为零 - 我们必须返回一个成员,你需要{ {1}},最后,我们需要另一个- 2
来从元组中获取成员。