2010-01-11 6 views
2

J'ai cette requête MDX (en fonction de la base de données exemple Foodmart):MDX: Comment transformer des tuples avec plusieurs membres en tuples avec un seul membre?

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

Cela génère un résultat comme celui-ci:

[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 

Ce que je voudrais avoir, est la suivante:

[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 

Je sais que je peux utiliser SetToStr() pour sérialiser les en-têtes de ligne à une chaîne. Donc maintenant je voudrais utiliser ce résultat comme rowheader: en tournant chaque tuple des tuples multi-membres d'origine sur l'axe ROW dans un tuple avec un seul membre, qui a une valeur est une concaténation des noms de membres d'origine. Donc, en gros ceci:

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

... mais bien sûr, cela ne fonctionne pas, parce que SetToStr() retourne une chaîne, pas un ensemble. J'ai donc besoin d'un moyen de «renvoyer» cette chaîne à un ensemble, mais avec un seul membre.

Est-ce possible dans le standard MDX? Comment? Je peux retravailler le résultat après l'avoir reçu mais je pourrais vraiment utiliser une solution MDX pure pour résoudre ce problème.

Répondre

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]