У меня есть ситуация, когда я хочу запросить несколько атрибутов (всего ~ 8 в целом) и включить промежуточные итоги. Это своего рода результат, что я хочу:SQL Rollup эквивалент в MDX
╔═══════╦═════════╦════════╦═════════╗
║ Attr1 ║ Attr2 ║ Attr3 ║ Measure ║
╠═══════╬═════════╬════════╬═════════╣
║ All ║ All ║ All ║ 50% ║
║ Foo ║ All ║ All ║ 25% ║
║ Bar ║ All ║ All ║ 90% ║
║ Foo ║ Anna ║ All ║ 42% ║
║ Foo ║ Brian ║ All ║ 12% ║
║ Bar ║ Charles ║ All ║ 10% ║
║ Bar ║ Dory ║ All ║ 112% ║
║ Foo ║ Anna ║ Box ║ 58% ║
║ Foo ║ Anna ║ Circle ║ 13% ║
║ ... ║ ... ║ ... ║ ... ║
╚═══════╩═════════╩════════╩═════════╝
Теперь я могу получить почти там делать что-то вроде этого:
select
{[Measures].[Measure]} on columns,
nonempty({
[Dim1].[Attr1].allmembers *
[Dim2].[Attr2].allmembers *
[Dim3].[Attr3].allmembers
}) on rows
from [Cube]
Однако, это, конечно, заставляет меня набор, который включает в себя элементы, которые выглядеть следующим образом:
╔═══════╦═════════╦════════╦═════════╗
║ Attr1 ║ Attr2 ║ Attr3 ║ Measure ║
╠═══════╬═════════╬════════╬═════════╣
║ Foo ║ All ║ Box ║ 25% ║
║ Bar ║ All ║ Circle ║ 90% ║
║ Foo ║ Anna ║ Box ║ 16% ║
║ Bar ║ Charles ║ Circle ║ 78% ║
║ ... ║ ... ║ ... ║ ... ║
╚═══════╩═════════╩════════╩═════════╝
что я не хочу, - я мог бы жить с ними, за исключением того, что с 8 размерами он делает это пойти немного сумасшедшим с перекрестным соединением (это дает мне ошибку о том, набор с более чем 4 бил левый кортеж в нем ...). Теперь, если бы я писал SQL я мог бы сделать что-то простое, как:
select
Dim1.Attr1,
Dim2.Attr2,
Dim3.Attr3,
Sum(Measures.Measure) as Measure
group by
Dim1.Attr1,
Dim2.Attr2,
Dim3.Attr3
with rollup
Но я не могу найти простой способ воспроизвести это в MDX. Я могу вручную построить каждый уровень с накопительным пакетом что-то вроде этого:
select
{[Measures].[Measure]} on columns,
nonempty(
{
{[Dim1].[Attr1].[All]} *
{[Dim2].[Attr2].[All]} *
{[Dim3].[Attr3].[All]}
} +
{
{[Dim1].[Attr1].[Attr1].allmembers} *
{[Dim2].[Attr2].[All]} *
{[Dim3].[Attr3].[All]}
} +
{
{[Dim1].[Attr1].[Attr1].allmembers} *
{[Dim2].[Attr2].[Attr2].allmembers} *
{[Dim3].[Attr3].[All]}
} +
{
{[Dim1].[Attr1].[Attr1].allmembers} *
{[Dim2].[Attr2].[Attr2].allmembers} *
{[Dim3].[Attr3].[Attr3].allmembers}
}
) on rows
from [Cube]
Но это уже становится утомительным только с тремя размерами - с указанием 9 групп них будут противно. Итак - есть ли способ сделать это в сжатом виде в MDX, или мне просто нужно пойти с долговременным решением?
С точки зрения предыдущих исследований, я наткнулся на кучу ответов, как this one, которые говорят, чтобы использовать WITH MEMBER
заявление, чтобы создать общую строку - но это бессмысленно для меня, так как это приводит к тому же перекрестное соединение поведения что я пытаюсь избежать с помощью функции allmembers
.
Edit: это последняя (дезинфицировать) версия кода, в том числе @ предложение Данилом о NonEmptyCrossJoin
:
NON EMPTY {
NONEMPTYCROSSJOIN(
{[Dim1].[Attribute].[All]} *
{[Dim2].[Attribute].[All]} *
{[Dim3].[Attribute].[All]} *
{[Dim4].[Attribute].[All]} *
{[Dim6].[Attribute].[All]} *
{[Dim7].[Attribute].[All]} *
{[Dim8].[Attribute].[All]} *
{[Dim9].[Attribute].[All]} *
[Dim0].[Attribute].[Attribute].ALLMEMBERS
) +
NONEMPTYCROSSJOIN(
[Dim1].[Attribute].[Attribute].ALLMEMBERS *
{[Dim2].[Attribute].[All]} *
{[Dim3].[Attribute].[All]} *
{[Dim4].[Attribute].[All]} *
{[Dim6].[Attribute].[All]} *
{[Dim7].[Attribute].[All]} *
{[Dim8].[Attribute].[All]} *
{[Dim9].[Attribute].[All]} *
[Dim0].[Attribute].[Attribute].ALLMEMBERS
) +
NONEMPTYCROSSJOIN(
[Dim1].[Attribute].[Attribute].ALLMEMBERS *
[Dim2].[Attribute].[Attribute].ALLMEMBERS *
{[Dim3].[Attribute].[All]} *
{[Dim4].[Attribute].[All]} *
{[Dim6].[Attribute].[All]} *
{[Dim7].[Attribute].[All]} *
{[Dim8].[Attribute].[All]} *
{[Dim9].[Attribute].[All]} *
[Dim0].[Attribute].[Attribute].ALLMEMBERS
) +
...
}
Пробовал ли вы использовать свою меру в качестве второго аргумента функции NonEmpty(), чтобы уменьшить размер сшитого набора? Это не поможет решить вашу проблему «выборочных итогов, таких как WITH ROLLUP», но может по крайней мере сделать возможным перекрестное соединение. – SebTHU