powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / Как переделать Calculation?
12 сообщений из 12, страница 1 из 1
Как переделать Calculation?
    #39947382
DaniilSeryi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дано: 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
Как переделать Calculation?
    #39947513
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DaniilSeryi,

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

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

PS. Не на чем (нет модели) проверить использование фунации Aggregate (или в данном случае Sum).
...
Рейтинг: 0 / 0
Как переделать Calculation?
    #39947536
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как переделать Calculation?
    #39947721
alexdr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Как переделать Calculation?
    #39947722
alexdr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Картинка с демонстрацией результатов последнего запроса ниже.
...
Рейтинг: 0 / 0
Как переделать Calculation?
    #39947871
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexdr
для меры [Calc Measure] получаем число 2, как Вы и планировали.


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

VALUES
(20141106 , 5 , 3, NULL),
(20141106 , 3 , 5, NULL)
...
Рейтинг: 0 / 0
Как переделать Calculation?
    #39947910
DaniilSeryi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ситуация такая.
В исходном запросе для группы мер два столбца. Если я создаю в этом запросе третий столбец, который считается на базе этих двух
(для простоты Столбец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
Как переделать Calculation?
    #39947948
alexdr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Как переделать Calculation?
    #39947965
alexdr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Как переделать Calculation?
    #39948132
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DaniilSeryi

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


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

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


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