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

Есть такой 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
Период в строке WHERE (MDX)
    #32159360
SashaV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
WITH
member [Time].[ВыбПериод] AS 'Aggregate([Time].[All Time].[2003].[q1].[January].:[Time].[All Time].[2003].[q1].[January].[10])'

Select ....


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

Ирина

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

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

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

Наверное это бы работало всегда быстрее, так как, кажется, что чем хитромудрее calculation members тем медленнее сервер соображает.
...
Рейтинг: 0 / 0
Период в строке WHERE (MDX)
    #32165809
Ирина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В данном случае есть возможность избежать вычисляемых членов, поэтому практически любой 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
Период в строке WHERE (MDX)
    #32166262
Roxer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо Ирина и остальные за ваши ответы.
Я как раз и пытался написать фильтр, но к сожалению я буквально недавно занялся 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
Период в строке WHERE (MDX)
    #32166837
Roxer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По поводу 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
Период в строке WHERE (MDX)
    #32166880
Ирина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забыла написать, что видимо NECJ нужно сделать на обеих осях, т.е. на продажах тоже. К сожалению у меня не было возможности ответить на вас вопрос по-фильтрам, фильтровать нужно time dimension, a не client. Может быть кто-нибудь напишет подробней, меня здесь в ближайшие дни не будет.

Ирина

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


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