powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / Помогите составить MDX
15 сообщений из 40, страница 2 из 2
Помогите составить MDX
    #33480587
ShIgor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так!
Во-первых, без измерения "Магазин" не обойтись, т.к. надо считать их количество на лету.
Во-вторых, все это реализовано и живет на AS2000.

CM для подсчета магазинов (назовем ее ShopCount):
Код: plaintext
1.
2.
3.
4.
IIF(
  IsEmpty(Measures.[ProdCount]), 
  null, 
  Count(CrossJoin(Descendants([Магазин].[All Магазин], [Магазин].[Магазин]), Measures.[ProdCount]}), excludeempty)
)

Далее надо получить общее число магазинов торговавших любой продукцией.
Для этого создадим еще один CM как тупл от всех измерений исключая измерения "время" и "магазин" (назовем ShopCountAll):
Код: plaintext
(Measures.[ShopCount], [All Регион магазина], [All Тип магазина], [All Продукция], [All Класс продукции])

Теперь еще один CM в котором просто делим одно на другое и используем формат Percent:
Код: plaintext
1.
2.
3.
4.
IIF(
  IsEmpty(Measures.[ProdCount]), 
  null, 
  Measures.[ShopCount] / Measures.[ShopCountAll]
)

Немного замечаний:
0. Все это можно сделать и в одном CM.
1. Чтоб считать дистрибуцию в регионе или типе магазина, или по классу продукта, надо выкинуть из CM ShopCountAll соответствующий All-член.
2. IIF(IsEmpty.... нужен только для того чтоб нули (0, не null) не появлялись у null ячеек.
3. При большом объеме данных считаться будет медленно особенно в Экселе.
4. Вместо CrossJoin(..., excludeempty) можно использовать NECJ (что быстрее), но только если в дальнейшем не будете делать CalculatedMembers (например рассчитать общую дистрибуцию по двум из общего количества регионов). По этой же причине я не использовал DistinctCount.

Если еще чего вспомню - напишу. Или задавайте вопросы.
...
Рейтинг: 0 / 0
Помогите составить MDX
    #33480662
Владимир Штепа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давайте разберемся с Measures.[ProdCount]. Это физическая мера или CM?

Скорее всего это СМ. Так как таблица фрктов представляет Periodic Snapshot, то Measures.[ProdCount] = LastNonEmptyChild(Measures.[ProdCount_Fact]) при аггрегации вдоль ост времени.

Следующий вопрос магазин учитывается как имевший товар, если товар был в магазине на конец период или в выбранном периоде товар бывал в магазине?

в формуле

Count(CrossJoin(Descendants([Магазин].[All Магазин], [Магазин].[Магазин]), Measures.[ProdCount]}), excludeempty)

стоит CrossJoin все таки зменить на NonEmptyCrossJoin (скорострельность)
...
Рейтинг: 0 / 0
Помогите составить MDX
    #33480693
Mosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ShIgorНемного замечаний:
Позволю себе откомментировать эти замечания, хотя я и не следил за всей дискуссией.

автор0. Все это можно сделать и в одном CM.
Но для повышения производительнисти, лучше оставить в разных CM

ShIgor2. IIF(IsEmpty.... нужен только для того чтоб нули (0, не null) не появлялись у null ячеек.
Это не совсем правильно. Правильная проверка именно на 0 = Measures.ShopCount. Вот здесь я об этом писал подробнее - http://www.sqljunkies.com/WebLog/mosha/archive/2005/06/30/mdx_is_empty.aspx

ShIgor3. При большом объеме данных считаться будет медленно особенно в Экселе.
А что такого особенного в Экселе что там будет считаться особенно медленно ?

ShIgor4. Вместо CrossJoin(..., excludeempty) можно использовать NECJ (что быстрее), но только если в дальнейшем не будете делать CalculatedMembers (например рассчитать общую дистрибуцию по двум из общего количества регионов). По этой же причине я не использовал DistinctCount.
Полностью согласен. В AS2005 наиболее оптимально это можно написать используя функцию NonEmpty которая работает так же быстро как и NECJ если нет CMs, а если они есть, то дает правильный результат. Более того, даже написать Filter(..., NOT IsEmpty(measure)) будет намного быстрее чем Count(...,EXCLUDEEMPTY)

Моша
----------------------------------------------------
This posting is provided "AS IS" with no warranties, and confers no rights
...
Рейтинг: 0 / 0
Помогите составить MDX
    #33480721
Аналитик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShIgor
Далее надо получить общее число магазинов торговавших любой продукцией.
Для этого создадим еще один CM как тупл от всех измерений исключая измерения "время" и "магазин" (назовем ShopCountAll):
Код: plaintext
(Measures.[ShopCount], [All Регион магазина], [All Тип магазина], [All Продукция], [All Класс продукции])


Не могу согласится с г-ном ShIgor по расчету общего числа магазинов, в том случае если в измерении "Продукция" хранятся только наши продукты, без учета продукции конкурентов.

Также использование приведенного CM для расчета общего к-ва магазинов при расчете дистрибуции, будет давать Вам всегда 100 % дистрибуции на уровнях All Level измерений.

Скажите есть ли у Вас в хранилище информация о посещении точек?
...
Рейтинг: 0 / 0
Помогите составить MDX
    #33480790
Владимир Штепа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mosha автор0. Все это можно сделать и в одном CM.
Но для повышения производительнисти, лучше оставить в разных CM


Пожалуйста, а можно про это по подробнее.
...
Рейтинг: 0 / 0
Помогите составить MDX
    #33480898
ShIgor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ко всем, я просто привел, свое решение от которого можно оттолкнуться!
2 backfire
Measures.[ProdCount] как написало:
SelfCoderВ таблице фактов хранится количество товара в магазине ([ProdCount]) здесь надо просто перенести ее в AS в качестве меры с любой (SUM, COUNT) функцией.
Следующий вопрос магазин учитывается как имевший товар, если товар был в магазине на конец период или в выбранном периоде товар бывал в магазине? если мы хотим считать distribution значит надо чтоб товар был в остатке на момент проверки. иначе это handling.
авторСледующий вопрос магазин учитывается как имевший товар, если товар был в магазине на конец период или в выбранном периоде товар бывал в магазине?читай примечание 4 моего поста - скорострельность - да, но уменьшаем функционал.
2 Mosha
Да, я читал Вашу статью, но 0 меня в этом случае не устраивает, т.к. 0 это не null, - Null для меня - отсутствие данных (например товар в регионе вообще не продается), а 0 означает, что магазин проверили, но товара в наличии не оказалось.
Про Эксель: Все мои (и моих коллег) эксперименты с ним приводили к тому, что запрос в экселе примерно на порядок дольше (не в секундах, в минутах и часах :)) ) чем например через MDX Sample Application.
2 Аналитик
1. Продукция конкурентов никак не влияет на дистрибуцию нашего продукта. Я с трудом представляю узконаправленные магазины, ориентированные только на одного производителя.
2. замечание верно, т.к. любые товары есть в любом магазине в любое время
3. Информация о посещении есть.
...
Рейтинг: 0 / 0
Помогите составить MDX
    #33480959
Владимир Штепа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShIgor 0 это не null, - Null для меня - отсутствие данных (например товар в регионе вообще не продается), а 0 означает, что магазин проверили, но товара в наличии не оказалось

Это в SQL Server 100 пудовое и железобетонное различие между 0 и Null.
В AS я бы на это полагатся не стал. Я хотел как и Вы различать, обжегся несколько раз. Так что лучше 0 и Null интерпретировать как одно и то же.
...
Рейтинг: 0 / 0
Помогите составить MDX
    #33481019
Аналитик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аналитик ShIgor
Далее надо получить общее число магазинов торговавших любой продукцией.
Для этого создадим еще один CM как тупл от всех измерений исключая измерения "время" и "магазин" (назовем ShopCountAll):
Код: plaintext
(Measures.[ShopCount], [All Регион магазина], [All Тип магазина], [All Продукция], [All Класс продукции])


Не могу согласится с г-ном ShIgor по расчету общего числа магазинов, в том случае если в измерении "Продукция" хранятся только наши продукты, без учета продукции конкурентов.

Также использование приведенного CM для расчета общего к-ва магазинов при расчете дистрибуции, будет давать Вам всегда 100 % дистрибуции на уровнях All Level измерений.


Уточню: Результатом приведенного Вами тупла будет общее к-во торговых точек, в которых когда-либо встречался товар.

А как же те магазины в которых не было товара, но они были посещены?
...
Рейтинг: 0 / 0
Помогите составить MDX
    #33481092
ShIgor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 backfire
Не могу, кроме дистрибуции есть еще несколько параметров, которые так же зависят от того что в ячейке 0 или null.
Приведу простой пример: В моей системе есть такие измерения Дивизион Регион Город Точка. В силу обстоятельств (читай желания заказчика) они построены не как иерархическое измерение, а как независимые друг от друга. В связи с этим, при простом CrossJoine получаем в каждом Дивизионе все Регионы, а в каждом Регионе все Города, и если для такого запроса Считать CM - толку мало! 90%, а то и более будут 0, к тому же не имеющими смысла: город Москва в Санкт-Петербургском дивизионе. NON EMPTY BEHAVIOR (как нам недавно рассказал Моша) ничем не помогает, а даже ухудшает ситуацию...

и еще Mosha Более того, даже написать Filter(..., NOT IsEmpty(measure)) будет намного быстрее чем Count(...,EXCLUDEEMPTY)
Это для меня пройденный этап. Я создавал несколько версий такого типа CM, в том числе и с Filter. В некотоых случаях Filter работал быстрее, в некоторых медленнее, в каких точно сейчас уже не скажу (могу, конечно, провести эксперимент т.к. до сих пор в половине баз использую CJ в более ранних Filter). Но большой разницы в скорости я нигде у себя не заметил.
...
Рейтинг: 0 / 0
Помогите составить MDX
    #33481126
ShIgor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АналитикУточню: Результатом приведенного Вами тупла будет общее к-во торговых точек, в которых когда-либо встречался товар.
Не когда-либо, а только в запрошенный период. Если период не запрашивать (не выводить его ни на одну из осей и не ставить во WHERE) то да - когда-либо.
АналитикА как же те магазины в которых не было товара, но они были посещены?
Во-первых: представьте себе магазины без товара... значит како-то товар там все-таки будет
Во-вторых: если нужно занести магазин без товара - заносятся продажи данного товара = 0 и остаток данного товара = 0. получается, что факт есть но отсутсвие в нем данного товара скажется на расчет дистрибуции по этому товару.
...
Рейтинг: 0 / 0
Помогите составить MDX
    #33481145
ShIgor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в догонку... в этом случае только СМ для расчета надо все-таки менять на проверку 0
...
Рейтинг: 0 / 0
Помогите составить MDX
    #33481220
SelfCoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем большое спасибо. Понял в каком направлении двигаться.
[ProdCount] - это физическая мера, я уже писал.
По поводу общего количества товара, то здесь несколько сложнее. Аналитик прав. Если мониторится какой-либо определенный продукт и конкуренты не заносятся, тогда эти магазины не будут учитываться.
Здесь я не договорил. Еще есть мера с информацией кикие магазины кем посещались (отношение многие-ко-многим). Вдобавок эта мера SCD. Задача значительно усложняется...
...
Рейтинг: 0 / 0
Помогите составить MDX
    #33481380
ShIgor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SelfCoderЕсли мониторится какой-либо определенный продукт и конкуренты не заносятся, тогда эти магазины не будут учитываться.
Поиграйте с 0 - см выше.
SelfCoderЕще есть мера с информацией кикие магазины кем посещались (отношение многие-ко-многим). Вдобавок эта мера SCD. Задача значительно усложняется...
т.е. сами себя перепроверяете? и извините, что такое SCD?
...
Рейтинг: 0 / 0
Помогите составить MDX
    #33481773
Владимир Штепа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SelfCoderВдобавок эта мера SCD. Задача значительно усложняется...

Как может быть мера Slowly Changed Dimension?
...
Рейтинг: 0 / 0
Помогите составить MDX
    #33482454
SelfCoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу прощения, опечатался, не мера - измерение.
...
Рейтинг: 0 / 0
15 сообщений из 40, страница 2 из 2
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / Помогите составить MDX
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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