MDX - транспонировать строки в столбцы - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь отобразить детали из двух строк в одну, используя MDX.Если я выполню приведенный ниже MDX, он вернет 2 строки: одну, содержащую ключ 998, и одну, содержащую клавишу 999

SELECT NON EMPTY { 
  [Measures].[FactTableCount] } ON COLUMNS, 
NON EMPTY { ([DimXXXX].[XXXXKey].[XXXXKey].ALLMEMBERS 
  * ([DimAAAA].[AAAAKey].[AAAAKey],{[DimBBBB].[Key].&[998],[DimBBBB].[Key].&[999]},[DimCCCC].[CCCCKey].[CCCCKey])
  ) } ON ROWS 
FROM ( SELECT ( { [DimXXXX].[XXXXKey].&[MyValue] } ) ON COLUMNS 
FROM [FactTable])

. Она возвращает что-то вроде этого

    (columns [DimXXXX].[XXXXKey], [DimAAAA].[AAAAKey], [DimBBBB].[Key], [DimCCCC].[CCCCKey], [Measures].[FactTableCount])

MyValue, MyAAAAKey1, 998, MyCCCCKey1, 1

MyValue, MyAAAAKey2, 999, MyCCCCKey2, 1

Однако я хочувернуть одну строку, как это

`(columns [DimXXXX].[Key], [DimAAAA].[AAAAKey], [DimAAAA].[AAAAKey], [DimBBBB].[Key], [DimBBBB].[Key], [DimCCCC].[CCCCKey], [DimCCCC].[CCCCKey], [Measures].[FactTableCount])

MyValue, MyAAAAKey1, MyAAAAKey2, 998, 999, MyCCCCKey1, MyCCCCKey2, 1

Среди прочего (например, использование SET, размещение логики 998/999 после ROWS / COLUMNS и т. д.), которые я пробовал

SELECT NON EMPTY { 
  [Measures].[FactTableCount] } ON COLUMNS, 
NON EMPTY { ([DimXXXX].[XXXXKey].[XXXXKey].ALLMEMBERS 
  * ([DimAAAA].[AAAAKey].[Key],[DimBBBB].[Key].&[998],[DimCCCC].[CCCCKey].[CCCCKey])
  * ([DimAAAA].[AAAAKey].[Key],[DimBBBB].[Key].&[999],[DimCCCC].[CCCCKey].[CCCCKey])
  ) } ON ROWS 
FROM ( SELECT ( { [DimXXXX].[XXXXKey].&[MyValue] } ) ON COLUMNS 
FROM [FactTable])

... однако, поскольку иерархия AAAAKey повторяется, я получаю сообщение об ошибке «Иерархия AAAAKey используется более одного раза в функции Crossjoin»

Есть ли способ сделать это?

1 Ответ

0 голосов
/ 15 февраля 2019

Исходя из вашего комментария ниже, у меня есть образец. Дайте мне знать, работает ли он.

Я думаю, что я могу видеть то, что вы говорите, однако меры - это одно, а значения измеренийдругие - скажем, Record1: MyValue, MyAAAAKey1, 998, MyCCCCKey1, 2 и Record2: MyValue, MyAAAAKey2, 999, MyCCCCKey2, 5 - я хотел бы вывести MyValue, MyAAAAKey1, MyAAAeyey2, 998, 9CC, MyCC

Итак, в приведенном ниже запросе я пытаюсь смоделировать вашу проблему.

select
{[Measures].[Internet Sales Amount]}
on columns,
non empty
([Customer].[City].[City],{[Product].[Category].&[1],[Product].[Category].&[3]},[Product].[Subcategory].[Subcategory])
on rows 
from [Adventure Works]

Результат enter image description here

Теперь мы можем перенести изменяющиеся значения в столбцы "{[Product]. [Category]. & 1 , [Product]. [Category]. & 2 } "в моем случае и" {[DimBBBB]. [Key]. & [998], [DimBBBB]. [Key]. & [999]} "в вашем случае

select
{
({[Product].[Category].&[1],[Product].[Category].&[3]},[Measures].[Internet Sales Amount]),
([Product].[Category].defaultmember,[Measures].[Internet Order Quantity])
}
on columns,
non empty
([Customer].[City].[City],[Product].[Subcategory].[Subcategory])
on rows 
from [Adventure Works]

Результат: enter image description here

Обратите внимание, что значения повторяются только для соответствующего столбца.Это добавит дополнительный столбец, но у вас теперь строки в два раза меньше оригинального.

Редактировать: для обработки требования на основе комментария

1-й ряд сетки будет Ballard, Bikes, Mountain Bikes, Road Bikes.2-й: Баллард, Одежда, Шапки, Перчатки.3-й: Barstow, Bikes, Road Bikes, null.Я хочу объединить / перечислить фактические значения измерений

Так что для достижения выше у нас есть два варианта.Но в любом случае потребуются некоторые манипуляции с пользовательским интерфейсом.1) Первый вариант

with member 
measures.t 
as (nonempty(existing([Customer].[City].currentmember,[Product].[Category].currentmember,[Product].[Subcategory].[Subcategory].members),[Measures].[Internet Sales Amount])).item(0).item(2).name

member measures.t1
as (nonempty(existing([Customer].[City].currentmember,[Product].[Category].currentmember,[Product].[Subcategory].[Subcategory].members),[Measures].[Internet Sales Amount])).item(1).item(2).name
select
{measures.t,measures.t1}
on columns,
nonempty(([Customer].[City].[City],{[Product].[Category].&[1],[Product].[Category].&[3]}),[Measures].[Internet Sales Amount])
on rows 
from [Adventure Works]

enter image description here

2) Второй вариант,

with member 
measures.t1
as 
[Customer].[City].currentmember.name

member measures.t2
as 
[Product].[Category].currentmember.name

member measures.t3 
as (nonempty(existing([Customer].[City].currentmember,[Product].[Category].currentmember,[Product].[Subcategory].[Subcategory].members),[Measures].[Internet Sales Amount])).item(0).item(2).name

member measures.t4
as (nonempty(existing([Customer].[City].currentmember,[Product].[Category].currentmember,[Product].[Subcategory].[Subcategory].members),[Measures].[Internet Sales Amount])).item(1).item(2).name

select
{measures.t1,measures.t2,measures.t3,measures.t4}
on columns,
nonempty(([Customer].[City].[City],{[Product].[Category].&[1],[Product].[Category].&[3]}),[Measures].[Internet Sales Amount])
on rows 
from [Adventure Works]

enter image description here

...