Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / Как переделать Calculation? / 12 сообщений из 12, страница 1 из 1
15.04.2020, 10:43
    #39947382
DaniilSeryi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как переделать Calculation?
Дано: Calculation.
iif(([Measures].[Мера1]-[Measures].[Мера2])<0,0,[Measures].[Мера1]-[Measures].[Мера2])
Мера1 и Мера2 аггрегируются как Sum.

При расчёте для единичного факта - всё отлично.
А при расчёте для агрегата получаем iif(([Measures].[Сумма Меры1]-[Measures].[Сумма Меры2])<0,0,[Measures].[Сумма Меры1]-[Measures].[Сумма Меры2])

Требуется же Сумма(iif(([Measures].[Мера1]-[Measures].[Мера2])<0,0,[Measures].[Мера1]-[Measures].[Мера2]))
Как переделать / что доделать?
...
Рейтинг: 0 / 0
15.04.2020, 14:57
    #39947513
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как переделать Calculation?
DaniilSeryi,

Единичного факта в кубе нет. Решение состоит в том, чтобы подать на вход дополнительное вычисляемое поле и сделать агрегат от него.
...
Рейтинг: 0 / 0
15.04.2020, 15:17
    #39947523
alexdr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как переделать Calculation?
Я бы сделал фиктивную меру в datasource view (т. н. place holder), которая в datasource view имеет значение NULL. Для нее бы в кубе определил агрегацию SUM. В скрипте куба определил бы scope (зависит от размерности куба) и в нем прописал бы формулу, вычисляющую/переназначающее значение ранее определенной фиктивной меры. Тогда бы агрегацией (SUM) на вышележащих уровнях занимался бы движок SSAS.

В ином случае придется вручную писать (переопределять) необходимую агрегацию для вышележащих уровней.

PS. Не на чем (нет модели) проверить использование фунации Aggregate (или в данном случае Sum).
...
Рейтинг: 0 / 0
15.04.2020, 15:51
    #39947536
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как переделать Calculation?
alexdr
Я бы сделал фиктивную меру в datasource view (т. н. place holder), которая в datasource view имеет значение NULL. Для нее бы в кубе определил агрегацию SUM. В скрипте куба определил бы scope (зависит от размерности куба) и в нем прописал бы формулу, вычисляющую/переназначающее значение ранее определенной фиктивной меры. Тогда бы агрегацией (SUM) на вышележащих уровнях занимался бы движок SSAS.

В ином случае придется вручную писать (переопределять) необходимую агрегацию для вышележащих уровней.

PS. Не на чем (нет модели) проверить использование фунации Aggregate (или в данном случае Sum).


Нет это не есть правильный путь. Надо сделать фиктивную меру в datasource view сразу как Мера1 - Мера2


Понимаете -- на самом низком уровне агрегации, где все измерения совпадают, у вас может быть

5 - 3
3 - 5

Получить надо -2. А Вы получите 0.
...
Рейтинг: 0 / 0
15.04.2020, 19:33
    #39947721
alexdr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как переделать Calculation?
a_voronin
Получить надо -2. А Вы получите 0.

Хм, ну отчего же? Возможно, я не очень хорошо понял, что хочет топикстартер. По Вашему примеру проще объяснять, что я имел ввиду. В качестве проверочной среды можно использовать AdventureWorks. У меня под рукой AdventureWorksDW2014, но это роли не играет. Я не очень хорошо понял как
a_voronin
сделать фиктивную меру в datasource view сразу как Мера1 - Мера2

Я писал вот о чем (далее очень упрощенно, исключительно чтобы продемонстрировать идею). Создаем тестовую "таблицу фактов" в DWH, которое под кубом (топикстартеру так делать не нужно, это для демонстрации):
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
IF OBJECT_ID('dbo.FactExample') IS NOT NULL DROP TABLE dbo.FactExample
SELECT
       DateKey,
       Measure1,
       Measure2,
       CalcMeasure
INTO dbo.FactExample
FROM
(
     VALUES
              (20141106 , 5 , 3, NULL),
              (20141107 , 3 , 5, NULL)
) t (DateKey, Measure1, Measure2, CalcMeasure)


Создаем в кубе новую группу мер с названием Example. В ней нас интересуют 3 меры Measure1, Measure2, CalcMeasure. Процессим.
Запрашиваем куб:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT
(
       {[Measures].[Measure1], [Measures].[Measure2], [Measures].[Calc Measure]}
) ON 0,
NON EMPTY
(
       [Date].[Calendar].Members
) ON 1
FROM [Adventure Works]


результат на картинке ниже.
Затем эмулируем scope, в котором прописываем вычисление для интересующей нас "фиктовной" меры, имевшей до этого значение NULL. В демонстрационных целях воссоздаем вычисление для [Measures].x как у топикстартера:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
WITH
	MEMBER Measures.X AS IIF ([Measures].[Measure1] - [Measures].[Measure2] <= 0, NULL, [Measures].[Measure1] - [Measures].[Measure2])
	CELL CALCULATION ScopeEmulator1
	FOR
		'(
			[Date].[Date].[Date],
			[Measures].[Calc Measure]
		)'
AS
IIF
	(
		[Measures].[Measure1] - [Measures].[Measure2] <= 0,
		NULL,
		[Measures].[Measure1] - [Measures].[Measure2]
	)
SELECT
	(
		{[Measures].[Measure1], [Measures].[Measure2], [Measures].[Calc Measure], Measures.X}
	) ON 0,
NON EMPTY
	(
		[Date].[Calendar].Members
	) ON 1
FROM [Adventure Works]


и видим, что на вышележащих уровнях (в данном случае измерения Date) для меры [Calc Measure] получаем число 2, как Вы и планировали.
...
Рейтинг: 0 / 0
15.04.2020, 19:34
    #39947722
alexdr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как переделать Calculation?
Картинка с демонстрацией результатов последнего запроса ниже.
...
Рейтинг: 0 / 0
16.04.2020, 08:52
    #39947871
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как переделать Calculation?
alexdr
для меры [Calc Measure] получаем число 2, как Вы и планировали.


А теперь сделайте одно маленькое измерение -- отнесите обе эти записи на одну и туже дату. И это вполне реально в боевой БД. И вот тогда вы получите 0.

VALUES
(20141106 , 5 , 3, NULL),
(20141106 , 3 , 5, NULL)
...
Рейтинг: 0 / 0
16.04.2020, 10:42
    #39947910
DaniilSeryi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как переделать Calculation?
Ситуация такая.
В исходном запросе для группы мер два столбца. Если я создаю в этом запросе третий столбец, который считается на базе этих двух
(для простоты Столбец1 минус Столбец2), и потом на его основе делаю агрегированную меру в кубе, то получаю сумму разностей:
Sum(Столбец1-Столбец2), что и нужно.
А если делаю Calculation на базе мер, созданных на базе этих столбцов, агрегированных по Sum, то получаю разность сумм: Sum(Мера1)-Sum(Мера2).
Если бы в формуле разницы не было доп.условий, то всё было бы нормально, но они есть, поэтому вопрос - как сделать Calculation, который считал бы именно Sum(Столбец1-Столбец2).

Вариант с созданием вычисляемого столбца в исходном запросе, и на его основе построить меру даёт правильные данные, но это не Calculation, а мера. И надо будет процессить куб, в отличие от добавления Calculation.

Второй вариант, как понимаю, это добавить вычисляемую меру в DataSource View в нужную группу мер (New Measure from Column), и потом уже её агрегировать? И как понимаю, опять речь идёт о процессинге куба?

И третий - это вариант с эмулированием scope, куда, как я понимаю, надо будет засунуть все измерения, связанные с конкретной группой мер?
...
Рейтинг: 0 / 0
16.04.2020, 11:23
    #39947948
alexdr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как переделать Calculation?
a_voronin
А теперь ... отнесите обе эти записи на одну и туже дату. ... И вот тогда вы получите 0.

Действительно, после агрегации на уровне ключевого атрибута измерения (день в нашем случае) в конкретном примере мы получим результат (NULL) 0. Вычисление будет произведено после такой аргегации.

Правильно или неправильно проводится расчет - это уже зависит от бизнес-смысла вычисляемой меры. Т. е. требуется уточнения бизнес-требований. Про это у топикстартера ничего нет. При появлении дополнительных бизнес-требований появятся дополнительные "костыли".
a_voronin
Надо сделать ... меру в datasource view сразу как Мера1 - Мера2

Тогда эта мера перестает быть фиктивной, она становится "посчитанной в ETL". И я так полагаю, что посчитанной по формуле типа:
CASE WHEN Мера1 - Мера2 <= 0 THEN 0 ELSE Мера1 - Мера2 END. В вашем случае вычисление производится до какой-либо агрегации в кубе.

Действительно, результат в первом и втором случае получится разным. Какой правильный - зависит от бизнес-смысла покакзателя и бизнес-требований. Это 2 разных подхода и они дают разные результаты.
...
Рейтинг: 0 / 0
16.04.2020, 12:00
    #39947965
alexdr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как переделать Calculation?
DaniilSeryi
надо будет процессить куб, в отличие от добавления Calculation.

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

DaniilSeryi
Если бы в формуле разницы не было доп.условий, то всё было бы нормально, но они есть, поэтому вопрос - как сделать Calculation, который считал бы именно Sum(Столбец1-Столбец2).

Хм... синтаксис функции AGGREGATE и SUM одинаков:
Код: sql
1.
Aggregate(Set_Expression [ ,Numeric_Expression ])


Там есть аргумент в виде Set_Expression и он не выглядит как Sum(Столбец1-Столбец2). Функции с таким как в последнеми случае синтаксисом в MDX нет. Как должен выглядеть Set_Expression в Вашем кубе (вычислении) я не знаю.

DaniilSeryi
Второй вариант, как понимаю, это добавить вычисляемую меру в DataSource View в нужную группу мер (New Measure from Column), и потом уже её агрегировать? И как понимаю, опять речь идёт о процессинге куба?

Скорее о процессинге заинтересованных партиций (и связанных с ними измерений). Если для Вашей группы мер определена одна партиция, значит речь пойдет о процессинге одной партиции.

DaniilSeryi
И третий - это вариант с эмулированием scope

Эмуляция scope это не третий вариант. Она была необходима для определения того, куда "приписываются" вычислениея. поскольку сам scope поддерживается только в скрипте куба. Scope предназначен для того, чобы показать движку куда вы хотите отнести ваши вычисления (определяет субкуб).
...
Рейтинг: 0 / 0
16.04.2020, 17:24
    #39948132
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как переделать Calculation?
DaniilSeryi

И третий - это вариант с эмулированием scope, куда, как я понимаю, надо будет засунуть все измерения, связанные с конкретной группой мер?


Этим вы положите нахрен куб.
...
Рейтинг: 0 / 0
16.04.2020, 17:45
    #39948155
Гулин Федор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как переделать Calculation?
DaniilSeryi,
Я не буду разбираться в деталях
просто если что-то можно сделать в ETL - то там и лучше делать
меры посчитанные по физическим столбцам (ну или столбцам во вью к-е могут быть вычисляемыми)
они ясные - там легко понять проблему с данным если таковые возникают
это НЕ всегда возможно - но если это возможно - то это правильный путь.

SCOPE интересная штука - но вот я даже как-то не понял как отлаживать Mdx с ней
т.е ее использование требует определенной квалификации.
...
Рейтинг: 0 / 0
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / Как переделать Calculation? / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]