MDX: Как превратить кортежи с несколькими членами в кортежи с одним участником? - PullRequest
2 голосов
/ 11 января 2010

У меня есть запрос 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() для сериализации заголовков строк в одну строку. Итак, теперь я хотел бы использовать этот результат в качестве заголовка строки: по сути, превращая каждый кортеж из исходных кортежей из нескольких элементов на оси ROW в кортеж только с одним членом, значение которого является объединением исходных имен элементов. Так что в основном это:

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

... но, конечно, это не работает, потому что SetToStr() возвращает строку, а не набор. Поэтому мне нужен какой-то способ «привести» эту строку обратно к набору, но только с одним членом.

Возможно ли это в стандартном MDX? Как? Я могу переделать набор результатов после его получения, но для решения этой проблемы я действительно мог бы использовать чистое решение MDX.

1 Ответ

4 голосов
/ 11 января 2010
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]
...