MDX:如何将具有多个成员的元组转换为具有单个成员的元组?

时间:2010-01-11 00:38:28

标签: olap mdx analysis

我有这个MDX查询(基于Foodmart示例数据库):

SELECT
{[Measures].[Profit]} ON COLUMNS,
{CROSSJOIN([Product].[All Products].Children, [Time].[1997].Children)} ON ROWS
FROM [Sales]

这会产生如下结果:

[Product].[Product Family] [Time].[Year] [Time].[Quarter] [Measures].[Profit]
--------------------------+-------------+----------------+-------------------
Drink                     |1997         |Q3              |7203.3445
Drink                     |1997         |Q4              |8005.2245
Food                      |1997         |Q1              |60814.47140000001
Food                      |1997         |Q2              |57323.3736

我想拥有的是:

[Product Family],[Year],[Quarter] [Measures].[Profit]
---------------------------------+-------------------
Drink, 1997, Q3                  |7203.3445
Drink, 1997, Q4                  |8005.2245
Food, 1997, Q1                   |60814.47140000001
Food, 1997, Q2                   |57323.3736

我知道我可以使用SetToStr()将行标题序列化为一个字符串。所以现在我想将该结果用作rowheader:基本上将每个元组从ROW轴上的原始多成员元组转换为只有一个成员的元组,其值是原始成员名称的串联。基本上就是这样:

SELECT
{[Measures].[Profit]} ON COLUMNS,
SetToStr(
    {CROSSJOIN([Product].[All Products].Children, [Time].[1997].Children)}
) ON ROWS
FROM [Sales]

...但当然这不起作用,因为SetToStr()返回一个字符串,而不是一个集合。所以我需要一些方法将这个字符串“强制转换”回一个集合,但只有一个成员。

这在标准MDX中是否可行?怎么样?我可以在收到结果集后重新编写结果集,但我真的可以使用纯MDX解决方案来解决这个问题。

1 个答案:

答案 0 :(得分:4)

WITH MEMBER [Measures].[name] 
AS [Product].currentMember.Name || ',' || [Time].CurrentMember.Name
SELECT { [Measures].[name] , [Measures].[Sales]} ON COLUMNS
,      ([Product].Children * [Time].Children)    ON ROWS
FROM   [SteelWheelsSales]