Агрегируйте значения на основе нескольких элементов измерения, чтобы создать отчет о прибылях и убытках с помощью оператора SCOPE - PullRequest
0 голосов
/ 27 мая 2019

Я относительно новичок в SSAS MDX и сталкиваюсь с проблемой создания агрегатов по всем показателям различных элементов измерения. Следующая картина лучше всего описывает то, чего я пытаюсь достичь: Проблема и какое решение должно быть

Это черновик и упрощение более сложного сценария, так что не беспокойтесь ;-). После проведения серии экспериментов я решил использовать простое измерение без связи с другими измерениями, чтобы иметь возможность использовать инструкцию SCOPE для переопределения полученных результатов в отчете. Простое измерение "Kurz PuL" содержит предшествующие элементы (Umsatz .. Periodenergebnis) и должно создавать отчет о прибылях и убытках.

Размер Kurz PuL

В настоящее время работает, чтобы показать результаты отдельных членов (например, Umsatz, Wareneinsatz, SbA, Personal). Но я не могу агрегировать значения более чем одного члена , чтобы получить агрегат, например: Umsatz + Wareneinsatz = Rohertrag. Я пробовал разные подходы, но ни один не работал. См. Следующие операторы SCOPE, которые используются для «переопределения» результирующих значений, отображаемых в Excel (первое изображение ^^):

ОБЛАСТЬ ПРИМЕНЕНИЯ:

    /*
The CALCULATE command controls the aggregation of leaf cells in the cube.
If the CALCULATE command is deleted or modified, the data within the cube is affected.
You should edit this command only if you manually specify how the cube is aggregated.
*/
CALCULATE;

SCOPE ([Kurz PuL].[Calculated].[Umsatz]);
    THIS = AGGREGATE([EinfacheBwaZeile].[Hierarchy].&[U]);
END SCOPE;

SCOPE ([Kurz PuL].[Calculated].[Wareneinsatz]);
    THIS = AGGREGATE([EinfacheBwaZeile].[Hierarchy].&[W]);
END SCOPE;

/* DOES NOT WORK: */
SCOPE ([Kurz PuL].[Calculated].[Rohertrag]);
    THIS = AGGREGATE(FILTER([EinfacheBwaZeile].[Hierarchy].CurrentMember, { [EinfacheBwaZeile].[Hierarchy].&[U], [EinfacheBwaZeile].[Hierarchy].&[W] }));
END SCOPE;

SCOPE ([Kurz PuL].[Calculated].[Personal]);
    THIS = AGGREGATE( { [EinfacheBwaZeile].[Hierarchy].&[P] });
END SCOPE;

SCOPE ([Kurz PuL].[Calculated].[Marketing]);
    THIS = AGGREGATE( { [EinfacheBwaZeile].[Hierarchy].&[M] });
END SCOPE;

/* DOES NOT WORK: */
SCOPE ([Kurz PuL].[Calculated].[Deckungsbeitrag]);
    THIS = AGGREGATE( {   [EinfacheBwaZeile].[Hierarchy].&[U], [EinfacheBwaZeile].[Hierarchy].&[W], [EinfacheBwaZeile].[Hierarchy].&[R], [EinfacheBwaZeile].[Hierarchy].&[P]
                        , [EinfacheBwaZeile].[Hierarchy].&[M], [EinfacheBwaZeile].[Hierarchy].&[D] });
END SCOPE;

SCOPE ([Kurz PuL].[Calculated].[SbA]);
    THIS = AGGREGATE( { [EinfacheBwaZeile].[Hierarchy].&[S] });
END SCOPE;

/* DOES NOT WORK: */
SCOPE ([Kurz PuL].[Calculated].[EBITDA]);
    THIS = AGGREGATE( {   [EinfacheBwaZeile].[Hierarchy].&[U], [EinfacheBwaZeile].[Hierarchy].&[W], [EinfacheBwaZeile].[Hierarchy].&[R], [EinfacheBwaZeile].[Hierarchy].&[P]
                        , [EinfacheBwaZeile].[Hierarchy].&[M], [EinfacheBwaZeile].[Hierarchy].&[D]
                        , [EinfacheBwaZeile].[Hierarchy].&[S], [EinfacheBwaZeile].[Hierarchy].&[A] });
END SCOPE;

/* DOES NOT WORK: */
SCOPE ([Kurz PuL].[Calculated].[EBIT]);
    THIS = AGGREGATE( {   [EinfacheBwaZeile].[Hierarchy].&[U], [EinfacheBwaZeile].[Hierarchy].&[W], [EinfacheBwaZeile].[Hierarchy].&[R], [EinfacheBwaZeile].[Hierarchy].&[P]
                        , [EinfacheBwaZeile].[Hierarchy].&[M], [EinfacheBwaZeile].[Hierarchy].&[D]
                        , [EinfacheBwaZeile].[Hierarchy].&[S], [EinfacheBwaZeile].[Hierarchy].&[A]
                        , [EinfacheBwaZeile].[Hierarchy].&[I] });
END SCOPE;

/* DOES NOT WORK: */
SCOPE ([Kurz PuL].[Calculated].[EBT]);
    THIS = AGGREGATE( {   [EinfacheBwaZeile].[Hierarchy].&[U], [EinfacheBwaZeile].[Hierarchy].&[W], [EinfacheBwaZeile].[Hierarchy].&[R], [EinfacheBwaZeile].[Hierarchy].&[P]
                        , [EinfacheBwaZeile].[Hierarchy].&[M], [EinfacheBwaZeile].[Hierarchy].&[D]
                        , [EinfacheBwaZeile].[Hierarchy].&[S], [EinfacheBwaZeile].[Hierarchy].&[A]
                        , [EinfacheBwaZeile].[Hierarchy].&[I]
                        , [EinfacheBwaZeile].[Hierarchy].&[T] });
END SCOPE;

/* DOES NOT WORK: */
SCOPE ([Kurz PuL].[Calculated].[Periodenergebnis]);
    THIS = AGGREGATE( {   [EinfacheBwaZeile].[Hierarchy].&[U], [EinfacheBwaZeile].[Hierarchy].&[W], [EinfacheBwaZeile].[Hierarchy].&[R], [EinfacheBwaZeile].[Hierarchy].&[P]
                        , [EinfacheBwaZeile].[Hierarchy].&[M], [EinfacheBwaZeile].[Hierarchy].&[D]
                        , [EinfacheBwaZeile].[Hierarchy].&[S], [EinfacheBwaZeile].[Hierarchy].&[A]
                        , [EinfacheBwaZeile].[Hierarchy].&[I]
                        , [EinfacheBwaZeile].[Hierarchy].&[T]
                        , [EinfacheBwaZeile].[Hierarchy].&[E] });
END SCOPE;

Я пытался найти ресурс, который объясняет, как агрегировать по нескольким элементам, но не нашел решения. Как я могу использовать функцию AGGREGATE () для объединения / суммирования значений, связанных с несколькими элементами измерения [EinfacheBwaZeile]. [Hierarchy] .A,… .B,… .C?

Я очень ценю ваши ответы! Заранее спасибо, Cordt

- ОБНОВЛЕНИЕ 2019-05-28 в качестве ответа Моазу на 2019-05-27: - Привет Моаз, Спасибо за ваше предложение. К сожалению, это решение не отвечает моим потребностям. Первое, на что нужно обратить внимание, это то, что мне нужен SCOPE-Statement, а не SELECT-MDX. Во-вторых, мне нужно, чтобы все меры определенных членов другого измерения были "обобщены". На первый взгляд это выглядит как «промежуточный итог», но это зависит от значений «предыдущих» членов, где некоторые могут быть пропущены. В словах примера Adventure Works, следующее показывает, что мне нужно:

SCOPE (MountainBikeSales);
    THIS = AGGREGATE(Product.&[Bikes]);
END SCOPE;
SCOPE (BikesAndAccessories);
    THIS = AGGREGATE({ Product.&[Bikes], Product.&[Accessories] });
END SCOPE;
SCOPE (BikesAccsClothing);
    THIS = AGGREGATE({ Product.&[Bikes], Product.&[Accessories], Product.&[Clothing] });
END SCOPE;

Это более понятно? Вы могли бы даже подумать о ОБЛАСТИ, в которой пропускаются аксессуары, суммируя велосипеды и одежду вместо аксессуаров. Для меня проблема в том, что первое утверждение будет успешным (то есть, суммирует одного члена), а другие - нет.

Спасибо за ваш совет! Cordt

1 Ответ

0 голосов
/ 27 мая 2019

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

with 
member 
[Measures].[Internet Sales AmountRunningtotal]
as 
case when [Measures].[Internet Sales Amount] = null then null 
else 
sum({[Product].[Subcategory].firstchild:[Product].[Subcategory].currentmember},[Measures].[Internet Sales Amount])
end
select {[Measures].[Internet Sales Amount],
[Measures].[Internet Sales AmountRunningtotal]
} on columns,

non empty
([Date].[Calendar Year].[Calendar Year],[Date].[Calendar Quarter of Year].[Calendar Quarter of Year],
[Product].[Category].[Category],[Product].[Subcategory].[Subcategory])
on 
rows 
from 
[Adventure Works]

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

Редактировать: на основе ваших правок

select 
{
[Measures].[Internet Sales Amount],
[Measures].[Internet Order Quantity],
[Measures].[Internet Tax Amount],
[Measures].[Internet Gross Profit Margin]
}on 0 , 
[Product].[Category].[Category]
on 1
from
[Adventure Works]

Результаты

enter image description here

Обратите внимание, что все показатели для компонентов имеют нулевые значения. Теперь приравниваем компоненты к велосипедам и аксессуарам

Scope  ([Product].[Category].&[2]) ;  
this = (aggregate({[Product].[Category].&[1],[Product].[Category].&[4]},[Measures].[Measures].currentmember));
end scope;

select 
{
[Measures].[Internet Sales Amount],
[Measures].[Internet Order Quantity],
[Measures].[Internet Tax Amount],
[Measures].[Internet Gross Profit Margin]
}on 0 , 
[Product].[Category].[Category]
on 1
from
[Adventure Works]

Результаты

enter image description here

...