Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Помогите правильно написать запрос
|
|||
|---|---|---|---|
|
#18+
Добрый день, работаю на 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))) Но как Вы увидите из запроса он не оптимальный (выполняется не очень быстро) так как на каждом узле расчитываються суммы из остатков на конец периода. Помогите, пожалуйста, написать правильный и быстрый запрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2005, 13:58 |
|
||
|
Помогите правильно написать запрос
|
|||
|---|---|---|---|
|
#18+
Что значит? "точек которые были посещены в этом периоде" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2005, 16:15 |
|
||
|
Помогите правильно написать запрос
|
|||
|---|---|---|---|
|
#18+
Например у нас всего 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 Именно так передо мной была поставлена задача считать остатки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2005, 17:22 |
|
||
|
Помогите правильно написать запрос
|
|||
|---|---|---|---|
|
#18+
А как часто собираются остатки? По каким периодам надо их смотреть? Какая у вас иерархия времени? Чему равен остаток на конец месяца, в который входят неделя 1 и 2? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2005, 18:01 |
|
||
|
Помогите правильно написать запрос
|
|||
|---|---|---|---|
|
#18+
Остатки собираются каждый день. Периоды по которым надо смотреть: Год, месяц, неделя, день. Иерархия: Год - Месяц - День, Год - Неделя - День. Остаток на конец месяца равен 2+1+2+5 = 10 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2005, 18:39 |
|
||
|
Помогите правильно написать запрос
|
|||
|---|---|---|---|
|
#18+
Уважаемые проффесионалы, я очень расчитываю на Вашу помощь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2005, 10:08 |
|
||
|
Помогите правильно написать запрос
|
|||
|---|---|---|---|
|
#18+
АналитикУважаемые проффесионалы, я очень расчитываю на Вашу помощь.Уважаемый аналитик, рассчитывать надо только на себя. Ибо никто не должен помогать Вам зарабатывать свою зарплату. А по существу, похоже, что Вам поможет Custom Rollup Formula с LastChild или что-то в этом роде http://www.sql.ru/forum/actualthread.aspx?tid=158700]iif(IsEmpty(Остаток), [Дата].PrevMember, Остаток) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2005, 12:42 |
|
||
|
Помогите правильно написать запрос
|
|||
|---|---|---|---|
|
#18+
Дмитрий,спасибо за полезную информацию но к сожалению она не пременима к моей задаче. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2005, 18:51 |
|
||
|
Помогите правильно написать запрос
|
|||
|---|---|---|---|
|
#18+
Дмитрий, скажите пожалуйста чему будет равен остаток (необходимо учитывать остатки только последних посещений точек) используя приведенную Вами формулу на уровне Город1 за Неделю 2 в случае если На Неделе2 посещено: 2 точки из 4 При первом визите остаток в Точке 2= 5 При втором визите остаток в Точке 2= 1 При первом визите остаток в Точке 3= 6 При втором визите остаток в Точке 3= 2 Заранее благодарен за ответ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2005, 19:01 |
|
||
|
Помогите правильно написать запрос
|
|||
|---|---|---|---|
|
#18+
А я вам указал не готовое решение, а направление поиска... так что в идеале (если дойти до конца), получите то, что вам нужно. Custom Rollup Formula поможет сворачивать остатки по дням до недели или месяца, т.е. не суммировать, а брать значение одного из дней. какого именно дня - поможет топик про поиск последнего непустого значения ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2005, 19:23 |
|
||
|
Помогите правильно написать запрос
|
|||
|---|---|---|---|
|
#18+
Спасибо за совет, формула классная. Но опять же она считает накопительные остатки. А вопрос был поставлен остатки на конец выбранного периода, без учета остатков точек которые не были посещены в выбранном периоде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2005, 13:15 |
|
||
|
Помогите правильно написать запрос
|
|||
|---|---|---|---|
|
#18+
Судя по ответам, я наверно попал в игнор лист ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2005, 16:38 |
|
||
|
Помогите правильно написать запрос
|
|||
|---|---|---|---|
|
#18+
землякам надо помогать.... скиньте базу на мыло в профиле. покумекаю на досуге. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2005, 02:25 |
|
||
|
Помогите правильно написать запрос
|
|||
|---|---|---|---|
|
#18+
АналитикНапример у нас всего 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-извращениями, а использовать хорошо обкатанные и известные формулы, которых на форуме, как гуталина на фабрике Матроскина - "ну просто завались" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2005, 16:07 |
|
||
|
Помогите правильно написать запрос
|
|||
|---|---|---|---|
|
#18+
Дмитрий, спасибо большое за желание помочь, без шуток приятно, землячество классная штука. К сожалению наша служба безопасности не позволит отправить ни базу, ни куб. Я могу описать факт таблицу КодТочки Дата (День недели) КодПродукта Остаток На основании этой таблицы построен куб. Для решения моей задачи я использовал запрос 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))) Считает то что надо, но он очень медленный, и сильно грузит компьютер чем соответственно не подходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2005, 10:52 |
|
||
|
Помогите правильно написать запрос
|
|||
|---|---|---|---|
|
#18+
Господин backfire, спасибо за Ваш ответ, я с Вами согласен как вариант добавление нулей в точки которые не посещались можно рассматривать и согласен что это позволит использовать стандартные формулы расчетов остатков. Но у данного подхода есть недостаток: на данный момент в факт таблице 500 000 записей, после добавление нулей к-во записей вырастит в 5 000 000, а соответственно размер куба также увеличится. Не подумайте, что я Вам морочу голову, но данный подход не очень подходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2005, 10:59 |
|
||
|
Помогите правильно написать запрос
|
|||
|---|---|---|---|
|
#18+
Скажите можно ли сделать так: После расчета дельт, в стандартном случае мы используем следующее выражение для получение накопительных остатков with member [Measures].[Остатки] as 'Sum(PeriodsToDate([Time].[Month].[(All)], [Time].[Month].CurrentMember), [Measures].[Остаток]) ' Я же предлагаю поступить по другому, но к сожалению не знаю как это сделать, найти точки которые были посещены в указанном периоде и для них расчитывать остатки по указанной выше формуле Да, но что делать в случае если анализировать в разрезе города? Если использовать Descendants, то тогда где? И как тогда при таких расчетах должно выглядеть выражение "Sum(PeriodsToDate([Time].[Month].[(All)], [Time].[Month].CurrentMember), [Measures].[Остаток])" ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2005, 11:14 |
|
||
|
Помогите правильно написать запрос
|
|||
|---|---|---|---|
|
#18+
во-первых, есть более быстрая формула для остатков с ancestors - на форуме была. во-вторых, добавьте измерение посещалась/нет. тогда сможете легко фильтровать те точки, которые нужны. кстати, какой клиент у вас? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2005, 12:30 |
|
||
|
Помогите правильно написать запрос
|
|||
|---|---|---|---|
|
#18+
Клиент мы свой пишем. Спасибо за рекомендацию, попробуем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2005, 17:15 |
|
||
|
Помогите правильно написать запрос
|
|||
|---|---|---|---|
|
#18+
Дмитрий, извините но на форуме я что-то не нашел "более быстрая формула для остатков с ancestors". Если Вас не затруднит дайте пожалуйста ссылку ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2005, 13:55 |
|
||
|
Помогите правильно написать запрос
|
|||
|---|---|---|---|
|
#18+
Dmitry Biryukovво-первых, есть более быстрая формула для остатков с ancestors - на форуме была. во-вторых, добавьте измерение посещалась/нет. тогда сможете легко фильтровать те точки, которые нужны. кстати, какой клиент у вас? А есть формула c Ancestors для случая нескольких иерархий временного измерения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2005, 13:58 |
|
||
|
Помогите правильно написать запрос
|
|||
|---|---|---|---|
|
#18+
Формулу я нашел. Теперь у меня так же появился вопрос по поводу иерархий, учитывая то что у меня как раз иерархия (Год-Месяць-День; Год-Неделя-День) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2005, 14:09 |
|
||
|
Помогите правильно написать запрос
|
|||
|---|---|---|---|
|
#18+
Только я хотел уточнить формула с Ancestors или Ascendants? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2005, 14:16 |
|
||
|
Помогите правильно написать запрос
|
|||
|---|---|---|---|
|
#18+
Всем спасибо, к сожалению так и не удалось получить ответа на поставленный вопрос, кроме господина 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) ) В факт таблице хранятся просто остатки (дельты не расчитывались) Основной недостаток формулы - длительность расчетов. Т.е. никаких сум от начала периода до текущего выбраного момента не используется,т.к. это дает накопительный остаток. А по условиям задачи необходимо выводить остаток по всем последним визитам за конкретный период времени без учета остатков из других периодов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2005, 14:18 |
|
||
|
|

start [/forum/topic.php?fid=49&msg=33298278&tid=1870984]: |
0ms |
get settings: |
5ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
205ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
37ms |
get tp. blocked users: |
1ms |
| others: | 228ms |
| total: | 500ms |

| 0 / 0 |
