Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Период в строке WHERE (MDX)
|
|||
|---|---|---|---|
|
#18+
Следующая проблема: Есть такой MDX запрос: select NON EMPTY [Client].children on Axis(0), NON EMPTY {[Goods.SubName].[Name].members} on Axis(1) from [Sales] where [Time].[YQMD].[2002].[Quarter 1].[January]. Как сделать, чтобы в строке where можно было указать период? Например, с 1-го по 5-ое Янавря. FILTER работает только для осей, двоеточие тоже не работает :( Скажите, пожалуйста, как быть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2003, 18:19 |
|
||
|
Период в строке WHERE (MDX)
|
|||
|---|---|---|---|
|
#18+
WITH member [Time].[ВыбПериод] AS 'Aggregate([Time].[All Time].[2003].[q1].[January].:[Time].[All Time].[2003].[q1].[January].[10])' Select .... WHERE ([Time].[ВыбПериод]) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2003, 11:41 |
|
||
|
Период в строке WHERE (MDX)
|
|||
|---|---|---|---|
|
#18+
Большое спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2003, 08:41 |
|
||
|
Период в строке WHERE (MDX)
|
|||
|---|---|---|---|
|
#18+
Ерунда какая-то с такими периодами в Where получается :( : Запрос select NON EMPTY [Client].children on Axis(0), NON EMPTY {[Goods].[Name].members} on Axis(1) from [Sales] where ([Measures].[Amount], [Time].[YQMD].[2001].[Quarter 2].[June].[26]) выполняется в течении нескольких секунд, однако если добавить даже минимальный период, типа with member [Time].[YQMD].[Period] as 'Aggregate([Time].[YQMD].[2001].[Quarter 2].[June].[26]:[Time].[YQMD].[2001].[Quarter 2].[June].[27])' select NON EMPTY [Client].children on Axis(0), NON EMPTY {[Goods].[Name].members} on Axis(1) from [Sales] where ([Measures].[Amount], [Time].[YQMD].[Period]) то такой запрос выполняется минут 6!! По логике должно выполнятся в 2 раза дольше. Даже если заменить период на простое сложение двух дат (with member [Time].[YQMD].[Period] as '[Time].[YQMD].[2001].[Quarter 2].[June].[26]+[Time].[YQMD].[2001].[Quarter 2].[June].[27])') запрос выполняется тоже долго, те же минут 6. Еще интресно то, что без указания ограничения на время в строке Where, запрос выполняется очень быстро. Сам куб пока при тестировании не большой. Однако таблицы измерений большие: товаров порядка 200 000, время - 3 года с детализацией до дня. Помогите, пожалуйста, скажите куда копать. Такое время выполнения запросов неприемлимо... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2003, 08:24 |
|
||
|
Период в строке WHERE (MDX)
|
|||
|---|---|---|---|
|
#18+
Расскажу по-секрету, в первом случае(когда нет calculated member в запросе) используется оптимизированный алгоритм, который использует данные фактов, когда есть calculated member, то факты использоваться не могут, поэтому и выполняется долго. Попробуйте поменять запрос так(кажется должен выйти тот же результат) select NonEmptyCrossJoin( [Client].children, [Time].[YQMD].[2001].[Quarter 2].[June].[26]:[Time].[YQMD].[2001].[Quarter 2].[June].[27], 1) on 0, Non Empty {[Goods].[Name].members} on 1 from [Sales] where ([Measures].[Amount]) Ирина ---------------------------------------------------- This posting is provided "AS IS" with no warranties, and confers no rights ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2003, 10:30 |
|
||
|
Период в строке WHERE (MDX)
|
|||
|---|---|---|---|
|
#18+
Большое спасибо, то что нужно. Можно еще узнать следующее: При указании периода обе его границы должны существовать, т.е. для, например, [Time].[YQMD].[2001].[Quarter 1].[January].[ 1]:[Time].[YQMD].[2001].[Quarter 1].[January].[10] обязательно в таблице фактов должны быть 1 и 10 Января. У меня же в таблице фактов времени могут быть пробелы, т.к. данные в таблицу берутся из реляционной таблицы заказов, а если не было заказов на 1 Января, то и в таблице фактов [Time] эта дата будет отсутствовать, соответственно и указанный запрос срубится. Можно ли средствами MDX все таки получить необходимый результат (что-то типа "следующая существующая дата за ...") или обязательно необходимо полностью заполнить таблицу фактов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2003, 13:37 |
|
||
|
Период в строке WHERE (MDX)
|
|||
|---|---|---|---|
|
#18+
Можно и следующий .NextMember. Ирина ---------------------------------------------------- This posting is provided "AS IS" with no warranties, and confers no rights Дата: вчера, 10:30 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2003, 10:30 |
|
||
|
Период в строке WHERE (MDX)
|
|||
|---|---|---|---|
|
#18+
Видимо Вы меня не совсем поняли. Я не могу взять [Time].[YQMD].[2001].[Quarter 1].[January].[ 1].Nextmember, т.к. у меня нет member [Time].[YQMD].[2001].[Quarter 1].[January].[ 1] В том то и проблема: пользователь задает период, а даты в таблице фактов из заданного периода может не существовать. Т.е. допустим есть в таблице фактов 2-ое,3-ье, 5-ое января, а пользователь задал период с 1-го по 10-ое. [Time].[YQMD].[2001].[Quarter 1].[January].[ 1]:[Time].[YQMD].[2001].[Quarter 1].[January].[10] при этом работать не будет. Видимо тут нужен какой то фильтр или спец. ф-ия языка MDX, которую я пока найти не могу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2003, 11:58 |
|
||
|
Период в строке WHERE (MDX)
|
|||
|---|---|---|---|
|
#18+
Я бы сделал так: 1. Когда пользователь задает диапазон дат то запустил бы запрос к серверу и узнал какие members существуют в моем Time dimension внутри диапазона. 2. Сформировал бы MDX, который Вы уже имеете на основе результатов 1. Наверное это бы работало всегда быстрее, так как, кажется, что чем хитромудрее calculation members тем медленнее сервер соображает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2003, 03:26 |
|
||
|
Период в строке WHERE (MDX)
|
|||
|---|---|---|---|
|
#18+
В данном случае есть возможность избежать вычисляемых членов, поэтому практически любой MDX будет работать быстрее, чем round-trip за членами, а потом использование их в запросе. Причем прийдется просить всех членов, если не измерения, то уровня, а это много. Можно покрутить тот же Filter(time.date.members.name, time.currentmember.parent.name='январь' and time.currentmember.name > '1' and time.currentmember.name < '10'). Запрос нужно конечно подредактировать, хотя бы потому что так сравнивать даты не правильно, но Вы наверняка разберетесь. Можно ф-ю Value применить, она строку в цифру переведет. Посмотрите еще на ф-ю generate, вместо фильтра, если получится, то она будет работать быстрее. Ирина ---------------------------------------------------- This posting is provided "AS IS" with no warranties, and confers no rights ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2003, 10:41 |
|
||
|
Период в строке WHERE (MDX)
|
|||
|---|---|---|---|
|
#18+
Большое спасибо Ирина и остальные за ваши ответы. Я как раз и пытался написать фильтр, но к сожалению я буквально недавно занялся OLAP и MDX, а хорошей документации я так и не нашел :(, поэтому никак не могу справится и написать нужный FILTER Как я понимаю это должно выглядеть так: FILTER([Client].children, ??????? ) on 0, Non Empty {[Goods].[Name].members} on 1 from [Sales] where ([Measures].[Amount]) Однако что только я не писал на место ????? :( Ничего не получается. Еще, как я понимаю проблема в том, что сравнивание не такое уж тревиальное. Зададут, например период с 30 декабря 2002 по 2 января 2003, там очень нелегко будет обойтись знаками "<>". Помогите, пожалуйста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2003, 15:15 |
|
||
|
Период в строке WHERE (MDX)
|
|||
|---|---|---|---|
|
#18+
По поводу NonEmptyCrossJoin Здесь Ирина сказала, что можно попробовать заменить with member [Time].[YQMD].[Period] as 'Aggregate([Time].[YQMD].[2001].[Quarter 2].[June].[26]:[Time].[YQMD].[2001].[Quarter 2].[June].[27])' select NON EMPTY [Client].children on Axis(0), NON EMPTY {[Goods].[Name].members} on Axis(1) from [Sales] where ([Measures].[Amount], [Time].[YQMD].[Period]) на select NonEmptyCrossJoin( [Client].children, [Time].[YQMD].[2001].[Quarter 2].[June].[26]:[Time].[YQMD].[2001].[Quarter 2].[June].[27], 1) on 0, Non Empty {[Goods].[Name].members} on 1 from [Sales] where ([Measures].[Amount]) к сожалению получаются разные результаты. В первом случае получаются продажи за указанный период. Во втором случае сначала выбираются клиенты, которые участвовали в продажах за указвнный период, а потом выбираются ВСЕ продажи по выбранному клиенту. Неужели никто не сталкивался с такой проблемой? Ведь задача то банальна: узнать продажи за выбранный период, расположив товары на одной оси и клиентов на другой. Если использовать calculated member, то запросы неимоверно долгие!! Тогда уж быстрее использовать SQL Server, чем OLAP. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2003, 10:31 |
|
||
|
Период в строке WHERE (MDX)
|
|||
|---|---|---|---|
|
#18+
Забыла написать, что видимо NECJ нужно сделать на обеих осях, т.е. на продажах тоже. К сожалению у меня не было возможности ответить на вас вопрос по-фильтрам, фильтровать нужно time dimension, a не client. Может быть кто-нибудь напишет подробней, меня здесь в ближайшие дни не будет. Ирина ---------------------------------------------------- This posting is provided "AS IS" with no warranties, and confers no rights ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2003, 10:52 |
|
||
|
Период в строке WHERE (MDX)
|
|||
|---|---|---|---|
|
#18+
К сожалению, NonEmptyCrossJoin на обеих осях все равно не даст нужный результат, если Вы имеете ввиду такое: select NonEmptyCrossJoin( [Client].children, [Time].[YQMD].[2001].[Quarter 2].[June].[26]:[Time].[YQMD].[2001].[Quarter 2].[June].[27], 1) on 0, NonEmptyCrossJoin( [Goods].[Name].members, [Time].[YQMD].[2001].[Quarter 2].[June].[26]:[Time].[YQMD].[2001].[Quarter 2].[June].[27], 1) on 1 from [Sales] where ([Measures].[Amount]) Тут выбирутся клиенты и товары, которые участвовали в продаже в заданный период, и потом продажи за ВЕСЬ период с выбранными клиентами и товарами. Т.е. если клиент 'A' купил 10 товаров 'B' 26-го июня и потом 5 тех же товаров 'B' 30-го июня, то результатом данного запроса будет 15. Правильным же результатом должно быть 10, т.к. меня интересует только период с 26 по 27 июня. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2003, 13:20 |
|
||
|
|

start [/forum/topic.php?fid=49&msg=32165614&tid=1873381]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
27ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
| others: | 290ms |
| total: | 414ms |

| 0 / 0 |
