powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / Помогите правильно написать запрос
25 сообщений из 47, страница 1 из 2
Помогите правильно написать запрос
    #33290817
Аналитик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, работаю на MS AS 2K

Проблема возникла с следующей задачей:
Нужно расчитать остатки на конец выбранного периода только для тех точек которые были посещены в этом периоде, и не учитывать остатки тех точек которые не посещались.

Есть куб, в котором хранятся дельты, расчет остатков выполняется следующим запросом:

with member [Measures].[Остатки] as
'Sum(nonemptycrossjoin(PeriodsToDate([Time].[Month].[(All)],
[Time].[Month].CurrentMember)), [Measures].[Остаток]) '

SELECT
crossjoin({[Time].[Month].[2005]}, {[Points].[зПТПД]}) ON
AXIS(1),
crossjoin({[SKU].[Весь ассортимент]}, {[Measures].[Остатки]}) ON
AXIS(0)
FROM Stock

Но запрос не очень подходит т.к. расчет остатков происходит по всем точкам которые посещались и не посещались, т.е. мы получаем накопительный остаток.

Также как второй вариант есть куб в котором хранятся непосредственно сами остатки. Тогда расчет остатков на конец выбранного периода только для тех точек которые были посещены в этом периоде я считаю следующим образом:

iif(IsLeaf([Points].Currentmember),

Tail (Filter(crossjoin({[Measures].[Stock]},
Descendants([Time].[Month].currentmember, [Time].[Month].Day)), (NOT
IsEmpty([Measures].[Stock]))), 1).item(0),

Sum(Descendants({[Points].Currentmember},[Points].[Point]), Tail
(Filter(crossjoin({[Measures].[Stock]},
Descendants([Time].[Month].currentmember, [Time].[Month].Day)), (NOT
IsEmpty([Measures].[Stock]))), 1).item(0)))

Но как Вы увидите из запроса он не оптимальный (выполняется не очень быстро) так как на каждом узле расчитываються суммы из остатков на конец периода.

Помогите, пожалуйста, написать правильный и быстрый запрос.
...
Рейтинг: 0 / 0
Помогите правильно написать запрос
    #33291336
Владимир Штепа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что значит?

"точек которые были посещены в этом периоде"
...
Рейтинг: 0 / 0
Помогите правильно написать запрос
    #33291568
Аналитик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например у нас всего 4 точек

На Неделе1 посещено: 4 точек все они входят в Город 1
При этом в
Точке 1 остаток на конец недели = 2
Точке 2 остаток на конец недели = 3
Точке 3 остаток на конец недели = 4
Точке 4 остаток на конец недели = 5

На Неделе2 посещено: 2 точки из 4
Точке 2 остаток на конец недели = 1
Точке 3 остаток на конец недели = 2

Например я хочу просмотреть какие остатки у меня по Городу 1 (т.е. по всем точкам входящим в него) на конец Недели1 в результате я должен получить 2+3+4+5=14

Например я хочу просмотреть какие остатки у меня по Городу 1 на конец Недели2 в результате должны получить сумму остатков только тех точек которые были посещены, т.е. Точка 2+Точка 3 = 1+2 =3

Именно так передо мной была поставлена задача считать остатки.
...
Рейтинг: 0 / 0
Помогите правильно написать запрос
    #33291690
Dmitry Biryukov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как часто собираются остатки?
По каким периодам надо их смотреть?
Какая у вас иерархия времени?
Чему равен остаток на конец месяца, в который входят неделя 1 и 2?
...
Рейтинг: 0 / 0
Помогите правильно написать запрос
    #33291766
Аналитик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Остатки собираются каждый день.
Периоды по которым надо смотреть: Год, месяц, неделя, день.
Иерархия: Год - Месяц - День, Год - Неделя - День.

Остаток на конец месяца равен 2+1+2+5 = 10
...
Рейтинг: 0 / 0
Помогите правильно написать запрос
    #33292430
Аналитик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемые проффесионалы, я очень расчитываю на Вашу помощь.
...
Рейтинг: 0 / 0
Помогите правильно написать запрос
    #33292916
Dmitry Biryukov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АналитикУважаемые проффесионалы, я очень расчитываю на Вашу помощь.Уважаемый аналитик, рассчитывать надо только на себя. Ибо никто не должен помогать Вам зарабатывать свою зарплату.
А по существу, похоже, что Вам поможет Custom Rollup Formula с LastChild
или что-то в этом роде http://www.sql.ru/forum/actualthread.aspx?tid=158700]iif(IsEmpty(Остаток), [Дата].PrevMember, Остаток)
...
Рейтинг: 0 / 0
Помогите правильно написать запрос
    #33294303
Аналитик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий,спасибо за полезную информацию но к сожалению она не пременима к моей задаче.
...
Рейтинг: 0 / 0
Помогите правильно написать запрос
    #33294322
Аналитик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий, скажите пожалуйста чему будет равен остаток (необходимо учитывать остатки только последних посещений точек) используя приведенную Вами формулу на уровне Город1 за Неделю 2 в случае если

На Неделе2 посещено: 2 точки из 4
При первом визите остаток в Точке 2= 5
При втором визите остаток в Точке 2= 1

При первом визите остаток в Точке 3= 6
При втором визите остаток в Точке 3= 2

Заранее благодарен за ответ
...
Рейтинг: 0 / 0
Помогите правильно написать запрос
    #33294371
Dmitry Biryukov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я вам указал не готовое решение, а направление поиска...
так что в идеале (если дойти до конца), получите то, что вам нужно.
Custom Rollup Formula поможет сворачивать остатки по дням до недели или месяца, т.е. не суммировать, а брать значение одного из дней. какого именно дня - поможет топик про поиск последнего непустого значения
...
Рейтинг: 0 / 0
Помогите правильно написать запрос
    #33298278
Аналитик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за совет, формула классная. Но опять же она считает накопительные остатки.
А вопрос был поставлен остатки на конец выбранного периода, без учета остатков точек которые не были посещены в выбранном периоде.
...
Рейтинг: 0 / 0
Помогите правильно написать запрос
    #33299063
Аналитик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Судя по ответам, я наверно попал в игнор лист
...
Рейтинг: 0 / 0
Помогите правильно написать запрос
    #33299649
Dmitry Biryukov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
землякам надо помогать.... скиньте базу на мыло в профиле. покумекаю на досуге.
...
Рейтинг: 0 / 0
Помогите правильно написать запрос
    #33299852
Владимир Штепа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АналитикНапример у нас всего 4 точек

На Неделе1 посещено: 4 точек все они входят в Город 1
При этом в
Точке 1 остаток на конец недели = 2
Точке 2 остаток на конец недели = 3
Точке 3 остаток на конец недели = 4
Точке 4 остаток на конец недели = 5

На Неделе2 посещено: 2 точки из 4
Точке 2 остаток на конец недели = 1
Точке 3 остаток на конец недели = 2

Например я хочу просмотреть какие остатки у меня по Городу 1 (т.е. по всем точкам входящим в него) на конец Недели1 в результате я должен получить 2+3+4+5=14

Например я хочу просмотреть какие остатки у меня по Городу 1 на конец Недели2 в результате должны получить сумму остатков только тех точек которые были посещены, т.е. Точка 2+Точка 3 = 1+2 =3

Именно так передо мной была поставлена задача считать остатки.

А не проще ли писать в базу для непосещенных точек 0 и не морочить голову MDX-извращениями, а использовать хорошо обкатанные и известные формулы, которых на форуме, как гуталина на фабрике Матроскина - "ну просто завались"
...
Рейтинг: 0 / 0
Помогите правильно написать запрос
    #33300709
Аналитик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий, спасибо большое за желание помочь, без шуток приятно, землячество классная штука. К сожалению наша служба безопасности не позволит отправить ни базу, ни куб.

Я могу описать факт таблицу

КодТочки
Дата (День недели)
КодПродукта
Остаток

На основании этой таблицы построен куб.
Для решения моей задачи я использовал запрос

iif(IsLeaf([Points].Currentmember),

Tail (Filter(crossjoin({[Measures].[Stock]},
Descendants([Time].[Month].currentmember, [Time].[Month].Day)), (NOT
IsEmpty([Measures].[Stock]))), 1).item(0),

Sum(Descendants({[Points].Currentmember},[Points].[Point]), Tail
(Filter(crossjoin({[Measures].[Stock]},
Descendants([Time].[Month].currentmember, [Time].[Month].Day)), (NOT
IsEmpty([Measures].[Stock]))), 1).item(0)))

Считает то что надо, но он очень медленный, и сильно грузит компьютер чем соответственно не подходит.
...
Рейтинг: 0 / 0
Помогите правильно написать запрос
    #33300736
Аналитик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господин backfire, спасибо за Ваш ответ, я с Вами согласен как вариант добавление нулей в точки которые не посещались можно рассматривать и согласен что это позволит использовать стандартные формулы расчетов остатков.

Но у данного подхода есть недостаток: на данный момент в факт таблице 500 000 записей, после добавление нулей к-во записей вырастит в
5 000 000, а соответственно размер куба также увеличится. Не подумайте, что я Вам морочу голову, но данный подход не очень подходит.
...
Рейтинг: 0 / 0
Помогите правильно написать запрос
    #33300780
Аналитик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скажите можно ли сделать так:

После расчета дельт, в стандартном случае мы используем следующее выражение для получение накопительных остатков

with member [Measures].[Остатки] as
'Sum(PeriodsToDate([Time].[Month].[(All)],
[Time].[Month].CurrentMember), [Measures].[Остаток]) '

Я же предлагаю поступить по другому, но к сожалению не знаю как это сделать, найти точки которые были посещены в указанном периоде и для них расчитывать остатки по указанной выше формуле
Да, но что делать в случае если анализировать в разрезе города? Если использовать Descendants, то тогда где?
И как тогда при таких расчетах должно выглядеть выражение "Sum(PeriodsToDate([Time].[Month].[(All)],
[Time].[Month].CurrentMember), [Measures].[Остаток])" ?
...
Рейтинг: 0 / 0
Помогите правильно написать запрос
    #33301055
Dmitry Biryukov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
во-первых, есть более быстрая формула для остатков с ancestors - на форуме была.
во-вторых, добавьте измерение посещалась/нет.
тогда сможете легко фильтровать те точки, которые нужны.
кстати, какой клиент у вас?
...
Рейтинг: 0 / 0
Помогите правильно написать запрос
    #33301913
Аналитик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Клиент мы свой пишем. Спасибо за рекомендацию, попробуем.
...
Рейтинг: 0 / 0
Помогите правильно написать запрос
    #33303726
Аналитик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий, извините но на форуме я что-то не нашел "более быстрая формула для остатков с ancestors". Если Вас не затруднит дайте пожалуйста ссылку
...
Рейтинг: 0 / 0
Помогите правильно написать запрос
    #33303738
Владимир Штепа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry Biryukovво-первых, есть более быстрая формула для остатков с ancestors - на форуме была.
во-вторых, добавьте измерение посещалась/нет.
тогда сможете легко фильтровать те точки, которые нужны.
кстати, какой клиент у вас?

А есть формула c Ancestors для случая нескольких иерархий временного измерения?
...
Рейтинг: 0 / 0
Помогите правильно написать запрос
    #33303773
Аналитик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Формулу я нашел. Теперь у меня так же появился вопрос по поводу иерархий, учитывая то что у меня как раз иерархия (Год-Месяць-День; Год-Неделя-День)
...
Рейтинг: 0 / 0
Помогите правильно написать запрос
    #33303798
Аналитик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только я хотел уточнить формула с Ancestors или Ascendants?
...
Рейтинг: 0 / 0
Помогите правильно написать запрос
    #33306365
Аналитик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо, к сожалению так и не удалось получить ответа на поставленный вопрос, кроме господина backfire, который предложил:

"А не проще ли писать в базу для непосещенных точек 0 и не морочить голову MDX-извращениями, а использовать хорошо обкатанные и известные формулы, которых на форуме, как гуталина на фабрике Матроскина - "ну просто завались"", к сожалению данный вариант не есть оптимальным с точки зрения к-ва данных.

Если все же интерес остался, давайте прододжим обсуждение.

Я достиг решения следующей формулой:

iif(IsLeaf([Points].Currentmember),

Tail (
Filter(
crossjoin(
{[Measures].[Stock]},
Descendants(
[Time]. [Month].currentmember, [Time].[Month].Day
)
)
, (NOT IsEmpty([Measures].[Stock]))
)
, 1).item(0),


Sum(
Tail (
Filter(
crossjoin(
{[Measures].[Stock]},
Descendants(
[Time]. [Month].currentmember, [Time].[Month].Day
)
)
, (NOT IsEmpty([Measures].[Stock]))
)
, 1).item(0)
)

В факт таблице хранятся просто остатки (дельты не расчитывались)

Основной недостаток формулы - длительность расчетов. Т.е. никаких сум от начала периода до текущего выбраного момента не используется,т.к. это дает накопительный остаток. А по условиям задачи необходимо выводить остаток по всем последним визитам за конкретный период времени без учета остатков из других периодов.
...
Рейтинг: 0 / 0
Помогите правильно написать запрос
    #33306464
Dmitry Biryukov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а вы пробовали в куб с дельтами добавить измерение "посещалась/нет" ?
...
Рейтинг: 0 / 0
25 сообщений из 47, страница 1 из 2
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / Помогите правильно написать запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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