Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / Период в строке WHERE (MDX) / 14 сообщений из 14, страница 1 из 1
13.05.2003, 18:19
    #32158930
Roxer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Период в строке WHERE (MDX)
Следующая проблема:

Есть такой 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 работает только для осей, двоеточие тоже не работает :(

Скажите, пожалуйста, как быть.
...
Рейтинг: 0 / 0
14.05.2003, 11:41
    #32159360
SashaV
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Период в строке WHERE (MDX)
WITH
member [Time].[ВыбПериод] AS 'Aggregate([Time].[All Time].[2003].[q1].[January].:[Time].[All Time].[2003].[q1].[January].[10])'

Select ....


WHERE ([Time].[ВыбПериод])
...
Рейтинг: 0 / 0
15.05.2003, 08:41
    #32160145
Roxer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Период в строке WHERE (MDX)
Большое спасибо
...
Рейтинг: 0 / 0
19.05.2003, 08:24
    #32162611
Roxer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Период в строке WHERE (MDX)
Ерунда какая-то с такими периодами в 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 года с детализацией до дня.

Помогите, пожалуйста, скажите куда копать. Такое время выполнения запросов неприемлимо...
...
Рейтинг: 0 / 0
19.05.2003, 10:30
    #32162710
Ирина
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Период в строке WHERE (MDX)
Расскажу по-секрету, в первом случае(когда нет 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
...
Рейтинг: 0 / 0
19.05.2003, 13:37
    #32162969
Roxer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Период в строке WHERE (MDX)
Большое спасибо, то что нужно.
Можно еще узнать следующее:
При указании периода обе его границы должны существовать, т.е. для, например,
[Time].[YQMD].[2001].[Quarter 1].[January].[ 1]:[Time].[YQMD].[2001].[Quarter 1].[January].[10]
обязательно в таблице фактов должны быть 1 и 10 Января. У меня же в таблице фактов времени могут быть пробелы, т.к. данные в таблицу берутся из реляционной таблицы заказов, а если не было заказов на 1 Января, то и в таблице фактов [Time] эта дата будет отсутствовать, соответственно и указанный запрос срубится.
Можно ли средствами MDX все таки получить необходимый результат (что-то типа "следующая существующая дата за ...") или обязательно необходимо полностью заполнить таблицу фактов?
...
Рейтинг: 0 / 0
20.05.2003, 10:30
    #32163691
Ирина
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Период в строке WHERE (MDX)
Можно и следующий .NextMember.

Ирина

----------------------------------------------------
This posting is provided "AS IS" with no warranties, and confers no rights
Дата: вчера, 10:30
...
Рейтинг: 0 / 0
20.05.2003, 11:58
    #32163818
Roxer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Период в строке WHERE (MDX)
Видимо Вы меня не совсем поняли.
Я не могу взять [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, которую я пока найти не могу.
...
Рейтинг: 0 / 0
22.05.2003, 03:26
    #32165614
Andriy777
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Период в строке WHERE (MDX)
Я бы сделал так:

1. Когда пользователь задает диапазон дат то запустил бы запрос к серверу и узнал какие members существуют в моем Time dimension внутри диапазона.

2. Сформировал бы MDX, который Вы уже имеете на основе результатов 1.

Наверное это бы работало всегда быстрее, так как, кажется, что чем хитромудрее calculation members тем медленнее сервер соображает.
...
Рейтинг: 0 / 0
22.05.2003, 10:41
    #32165809
Ирина
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Период в строке WHERE (MDX)
В данном случае есть возможность избежать вычисляемых членов, поэтому практически любой 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
...
Рейтинг: 0 / 0
22.05.2003, 15:15
    #32166262
Roxer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Период в строке WHERE (MDX)
Большое спасибо Ирина и остальные за ваши ответы.
Я как раз и пытался написать фильтр, но к сожалению я буквально недавно занялся OLAP и MDX, а хорошей документации я так и не нашел :(, поэтому никак не могу справится и написать нужный FILTER

Как я понимаю это должно выглядеть так:
FILTER([Client].children,
???????
) on 0,
Non Empty
{[Goods].[Name].members}
on 1
from [Sales]
where ([Measures].[Amount])

Однако что только я не писал на место ????? :( Ничего не получается.
Еще, как я понимаю проблема в том, что сравнивание не такое уж тревиальное. Зададут, например период с 30 декабря 2002 по 2 января 2003, там очень нелегко будет обойтись знаками "<>".
Помогите, пожалуйста.
...
Рейтинг: 0 / 0
23.05.2003, 10:31
    #32166837
Roxer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Период в строке WHERE (MDX)
По поводу 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.
...
Рейтинг: 0 / 0
23.05.2003, 10:52
    #32166880
Ирина
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Период в строке WHERE (MDX)
Забыла написать, что видимо NECJ нужно сделать на обеих осях, т.е. на продажах тоже. К сожалению у меня не было возможности ответить на вас вопрос по-фильтрам, фильтровать нужно time dimension, a не client. Может быть кто-нибудь напишет подробней, меня здесь в ближайшие дни не будет.

Ирина

----------------------------------------------------
This posting is provided "AS IS" with no warranties, and confers no rights
...
Рейтинг: 0 / 0
23.05.2003, 13:20
    #32167148
Roxer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Период в строке WHERE (MDX)
К сожалению, 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 июня.
...
Рейтинг: 0 / 0
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / Период в строке WHERE (MDX) / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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