|
|
|
Как переделать Calculation?
|
|||
|---|---|---|---|
|
#18+
Дано: 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])) Как переделать / что доделать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2020, 10:43 |
|
||
|
Как переделать Calculation?
|
|||
|---|---|---|---|
|
#18+
DaniilSeryi, Единичного факта в кубе нет. Решение состоит в том, чтобы подать на вход дополнительное вычисляемое поле и сделать агрегат от него. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2020, 14:57 |
|
||
|
Как переделать Calculation?
|
|||
|---|---|---|---|
|
#18+
Я бы сделал фиктивную меру в datasource view (т. н. place holder), которая в datasource view имеет значение NULL. Для нее бы в кубе определил агрегацию SUM. В скрипте куба определил бы scope (зависит от размерности куба) и в нем прописал бы формулу, вычисляющую/переназначающее значение ранее определенной фиктивной меры. Тогда бы агрегацией (SUM) на вышележащих уровнях занимался бы движок SSAS. В ином случае придется вручную писать (переопределять) необходимую агрегацию для вышележащих уровней. PS. Не на чем (нет модели) проверить использование фунации Aggregate (или в данном случае Sum). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2020, 15:17 |
|
||
|
Как переделать Calculation?
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2020, 15:51 |
|
||
|
Как переделать Calculation?
|
|||
|---|---|---|---|
|
#18+
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. Создаем в кубе новую группу мер с названием Example. В ней нас интересуют 3 меры Measure1, Measure2, CalcMeasure. Процессим. Запрашиваем куб: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. результат на картинке ниже. Затем эмулируем 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. и видим, что на вышележащих уровнях (в данном случае измерения Date) для меры [Calc Measure] получаем число 2, как Вы и планировали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2020, 19:33 |
|
||
|
Как переделать Calculation?
|
|||
|---|---|---|---|
|
#18+
Картинка с демонстрацией результатов последнего запроса ниже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2020, 19:34 |
|
||
|
Как переделать Calculation?
|
|||
|---|---|---|---|
|
#18+
alexdr для меры [Calc Measure] получаем число 2, как Вы и планировали. А теперь сделайте одно маленькое измерение -- отнесите обе эти записи на одну и туже дату. И это вполне реально в боевой БД. И вот тогда вы получите 0. VALUES (20141106 , 5 , 3, NULL), (20141106 , 3 , 5, NULL) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2020, 08:52 |
|
||
|
Как переделать Calculation?
|
|||
|---|---|---|---|
|
#18+
Ситуация такая. В исходном запросе для группы мер два столбца. Если я создаю в этом запросе третий столбец, который считается на базе этих двух (для простоты Столбец1 минус Столбец2), и потом на его основе делаю агрегированную меру в кубе, то получаю сумму разностей: Sum(Столбец1-Столбец2), что и нужно. А если делаю Calculation на базе мер, созданных на базе этих столбцов, агрегированных по Sum, то получаю разность сумм: Sum(Мера1)-Sum(Мера2). Если бы в формуле разницы не было доп.условий, то всё было бы нормально, но они есть, поэтому вопрос - как сделать Calculation, который считал бы именно Sum(Столбец1-Столбец2). Вариант с созданием вычисляемого столбца в исходном запросе, и на его основе построить меру даёт правильные данные, но это не Calculation, а мера. И надо будет процессить куб, в отличие от добавления Calculation. Второй вариант, как понимаю, это добавить вычисляемую меру в DataSource View в нужную группу мер (New Measure from Column), и потом уже её агрегировать? И как понимаю, опять речь идёт о процессинге куба? И третий - это вариант с эмулированием scope, куда, как я понимаю, надо будет засунуть все измерения, связанные с конкретной группой мер? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2020, 10:42 |
|
||
|
Как переделать Calculation?
|
|||
|---|---|---|---|
|
#18+
a_voronin А теперь ... отнесите обе эти записи на одну и туже дату. ... И вот тогда вы получите 0. Действительно, после агрегации на уровне ключевого атрибута измерения (день в нашем случае) в конкретном примере мы получим результат (NULL) 0. Вычисление будет произведено после такой аргегации. Правильно или неправильно проводится расчет - это уже зависит от бизнес-смысла вычисляемой меры. Т. е. требуется уточнения бизнес-требований. Про это у топикстартера ничего нет. При появлении дополнительных бизнес-требований появятся дополнительные "костыли". a_voronin Надо сделать ... меру в datasource view сразу как Мера1 - Мера2 Тогда эта мера перестает быть фиктивной, она становится "посчитанной в ETL". И я так полагаю, что посчитанной по формуле типа: CASE WHEN Мера1 - Мера2 <= 0 THEN 0 ELSE Мера1 - Мера2 END. В вашем случае вычисление производится до какой-либо агрегации в кубе. Действительно, результат в первом и втором случае получится разным. Какой правильный - зависит от бизнес-смысла покакзателя и бизнес-требований. Это 2 разных подхода и они дают разные результаты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2020, 11:23 |
|
||
|
Как переделать Calculation?
|
|||
|---|---|---|---|
|
#18+
DaniilSeryi надо будет процессить куб, в отличие от добавления Calculation. Не хотите, чтобы движок выполнял за вас агрегацию со всем причитающимися дополнительными плюшками от этого, тогда придется прописывать формулы вручную на каждом из вышележащих уровней. DaniilSeryi Если бы в формуле разницы не было доп.условий, то всё было бы нормально, но они есть, поэтому вопрос - как сделать Calculation, который считал бы именно Sum(Столбец1-Столбец2). Хм... синтаксис функции AGGREGATE и SUM одинаков: Код: sql 1. Там есть аргумент в виде Set_Expression и он не выглядит как Sum(Столбец1-Столбец2). Функции с таким как в последнеми случае синтаксисом в MDX нет. Как должен выглядеть Set_Expression в Вашем кубе (вычислении) я не знаю. DaniilSeryi Второй вариант, как понимаю, это добавить вычисляемую меру в DataSource View в нужную группу мер (New Measure from Column), и потом уже её агрегировать? И как понимаю, опять речь идёт о процессинге куба? Скорее о процессинге заинтересованных партиций (и связанных с ними измерений). Если для Вашей группы мер определена одна партиция, значит речь пойдет о процессинге одной партиции. DaniilSeryi И третий - это вариант с эмулированием scope Эмуляция scope это не третий вариант. Она была необходима для определения того, куда "приписываются" вычислениея. поскольку сам scope поддерживается только в скрипте куба. Scope предназначен для того, чобы показать движку куда вы хотите отнести ваши вычисления (определяет субкуб). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2020, 12:00 |
|
||
|
Как переделать Calculation?
|
|||
|---|---|---|---|
|
#18+
DaniilSeryi И третий - это вариант с эмулированием scope, куда, как я понимаю, надо будет засунуть все измерения, связанные с конкретной группой мер? Этим вы положите нахрен куб. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2020, 17:24 |
|
||
|
Как переделать Calculation?
|
|||
|---|---|---|---|
|
#18+
DaniilSeryi, Я не буду разбираться в деталях просто если что-то можно сделать в ETL - то там и лучше делать меры посчитанные по физическим столбцам (ну или столбцам во вью к-е могут быть вычисляемыми) они ясные - там легко понять проблему с данным если таковые возникают это НЕ всегда возможно - но если это возможно - то это правильный путь. SCOPE интересная штука - но вот я даже как-то не понял как отлаживать Mdx с ней т.е ее использование требует определенной квалификации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2020, 17:45 |
|
||
|
|

start [/forum/topic.php?fid=49&msg=39947721&tid=1857340]: |
0ms |
get settings: |
8ms |
get forum list: |
10ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
58ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
| others: | 11ms |
| total: | 147ms |

| 0 / 0 |

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