powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / Остатки на предыдущий период и мультиселект SSAS 2008
20 сообщений из 20, страница 1 из 1
Остатки на предыдущий период и мультиселект SSAS 2008
    #38174809
Lia7575
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте! В кубе есть last value мера: остатки на конец периода. И нужно посчитать на начало периода, для чего я хочу взять эту же меру на предыдущий период. Делаю так
Код: sql
1.
2.
3.
Scope [Measures].[Сумма остатка на начало периода];       
THIS = ([Measures].[Сумма остатка на конец периода], [Дата].[Иерархия времени].PrevMember);                                                   
End Scope;


все считается, но не работает на мультиселекте. Подскажите, пожалуйста, как переписать для мультиселекта.
...
Рейтинг: 0 / 0
Остатки на предыдущий период и мультиселект SSAS 2008
    #38174917
user6278
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lia7575,

imho: я бы сделал отдельную меру - остаток на начало периода.
...
Рейтинг: 0 / 0
Остатки на предыдущий период и мультиселект SSAS 2008
    #38174939
Lia7575
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
user6278,

Но у меня в таблице фактов - сумма остатка на конец каждого дня
...
Рейтинг: 0 / 0
Остатки на предыдущий период и мультиселект SSAS 2008
    #38175143
RioMare
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lia7575,

Записывайте в calculations куба как-то так
Код: sql
1.
2.
([Дата].[Иерархия времени].[День],[Measures].[Сумма остатка на начало периода]) 
  = ([Measures].[Сумма остатка на конец периода], [Дата].[Иерархия времени].PrevMember); 



или напрямую задавайте иерархию в SCOPE по которой нужнен мультиселект
...
Рейтинг: 0 / 0
Остатки на предыдущий период и мультиселект SSAS 2008
    #38176409
Lia7575
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
RioMare,
К сожалению, так тоже не получается. На мультиселекте не работает
...
Рейтинг: 0 / 0
Остатки на предыдущий период и мультиселект SSAS 2008
    #38176412
loki1984
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lia7575,

А создать ещё 1 вьюху поверх остатков, где отнять от даты один день и засунуть её как новую measure group не подойдёт?
...
Рейтинг: 0 / 0
Остатки на предыдущий период и мультиселект SSAS 2008
    #38176618
Lia7575
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
loki1984,

Я думала об этом. Но если выбирать несколько месяцев или лет?
...
Рейтинг: 0 / 0
Остатки на предыдущий период и мультиселект SSAS 2008
    #38176636
RioMare
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lia7575,

Как предплолжение - ваш мультиселект не понимает что такое [Дата].[Иерархия времени] .PrevMember
Как вариант - посмотрите вот это

Ещё лучше если напишите что "не работает" ( MDX ) и как "не работает" ( результат )
...
Рейтинг: 0 / 0
Остатки на предыдущий период и мультиселект SSAS 2008
    #38176665
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RioMareLia7575,

Записывайте в calculations куба как-то так
Код: sql
1.
2.
([Дата].[Иерархия времени].[День],[Measures].[Сумма остатка на начало периода]) 
  = ([Measures].[Сумма остатка на конец периода], [Дата].[Иерархия времени].PrevMember); 



или напрямую задавайте иерархию в SCOPE по которой нужнен мультиселект
Выбрали в иерархии галочками один квартал и один месяц из другого квартала. Что покажет multiselect? На один подзапрос [Дата].[Иерархия времени].PrevMember укажет предыдущий месяц, на другой подзапрос [Дата].[Иерархия времени].PrevMember укажет предыдущий квартал, и что это даст, будет 2 разные суммы - 10 штук на февраль 2012 и 20 штук на второй квартал 2005, что показывать в отчете, как это суммировать? Не работает multiselect на остатках, и не должен, мера не аддитивная.
...
Рейтинг: 0 / 0
Остатки на предыдущий период и мультиселект SSAS 2008
    #38177150
Lia7575
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Andy_OLAP,

А если, предположим, выбрать период с 1 по 6 марта. Остатки на конец дня 6 марта я увижу. А как посмотреть остатки на начало этого периода?
...
Рейтинг: 0 / 0
Остатки на предыдущий период и мультиселект SSAS 2008
    #38177179
RioMare
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andy_OLAP,
Как я понимаю ( но могу и ошибаться ) проблема тут немного другая - для "февраль 2013" LastCHild меры для остатков на "Q1/2013" ещё нет ( как и на "2013 год" ). Однако если выбрать только месяцы, то должно показать и на "февраль 2013" и аггрегированое значение должно быть тоже на "февраль 2013".
С прошлым полным периодом должно работать нормально, поскольку на 2012 год все значения определены ( если конечно время не запихивать в фильтр в Екселе ).
...
Рейтинг: 0 / 0
Остатки на предыдущий период и мультиселект SSAS 2008
    #38177231
Lia7575
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я просто хочу видеть остаток на начало периода и на конец периода. Если я выбираю один день или один месяц, то я вижу эти остатки. А если я выбираю несколько дней подряд или месяцев, то, соответственно, вижу только остаток на конец периода.
...
Рейтинг: 0 / 0
Остатки на предыдущий период и мультиселект SSAS 2008
    #38177585
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lia7575Я просто хочу видеть остаток на начало периода и на конец периода. Если я выбираю один день или один месяц, то я вижу эти остатки. А если я выбираю несколько дней подряд или месяцев, то, соответственно, вижу только остаток на конец периода.

Напишите простую формулу [Дата].[Г-М-Д].PrevMember.Properties("Key").
Для одного месяца февраля 2005 она выдаст "200501", для 2007 года выдаст "2006" (ключи соответствующих атрибутов "Месяц" или "Год" ).
Теперь выберите фильтр Г-М-Д в фильтр отчета в Excel. Выберите февраль 2006 - работает.
А теперь выберите февраль 2006 и март 2006 2 галочками. Не работает.
Потому что не должно, мера не аддитивная.

И остатки - то же самое. Выбираете март 2005, 1 апреля 2006 и весь 2007 год. Остатки на 2007 год Вам должен показать куб? А если на декабрь 2007 не определено, а на февраль 2005 определена мера - будет выбираться март 2005?

Мне кажется, Редмонд специально сделал так, чтобы при множественном выборе подобные формулы не работали. Суммы складываются, а все остальное - не работает. И не должно.
...
Рейтинг: 0 / 0
Остатки на предыдущий период и мультиселект SSAS 2008
    #38177626
Lia7575
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Andy_OLAP,

Так а какой тогда выход? Если я не могу с помощью MDX построить остатки на начало периода, то каким образом мне это сделать? Мне не нужно выбирать, предположим, 2007-й год, март 2011-го и 1 января 2013-го. Я всего лишь хочу посмотреть остатки на начало и конец выбранного периода. Т.е., например, с 15 января по 15 февраля. Или с марта по май
...
Рейтинг: 0 / 0
Остатки на предыдущий период и мультиселект SSAS 2008
    #38177641
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lia7575Andy_OLAP,

Так а какой тогда выход? Если я не могу с помощью MDX построить остатки на начало периода, то каким образом мне это сделать? Мне не нужно выбирать, предположим, 2007-й год, март 2011-го и 1 января 2013-го. Я всего лишь хочу посмотреть остатки на начало и конец выбранного периода. Т.е., например, с 15 января по 15 февраля. Или с марта по май
А выхода нет. Вообще. Для одного длинного непрерывного периода можно получить начало формулой Head и хвост формулой Tail, выбра в фильтр дату из второго измерения дат.
Далее взяв ключ первого дня периода и ключ последнего дня периода, можно получить месяц первого дня и месяц последнего дня, далее по иерархии Г-М-Д выбрать предыдущий месяц от первого дня периода и остатки на конец этого предыдущего месяца - вот Вам остаток на начало периода. Далее просто остаток на конец периода для последнего выбранного месяца. Ну, допустим, выбрали 1-й квартал 2013, получили остатки на конец декабря 2012 и остатки на конец марта 2013. При этом это 2 РАЗНЫХ показателя, 2 разные формулы.

Но если галочками Вы выбрали 2 квартала - вот считается мера остатка на декабрь 2012, мера на март 2013, что в куб возвращать из OLAPа? Ведь это будут 2 подзапроса, которые друг о друге ничего не знают, а сложить как сумму нельзя - мера не аддитивная.
Вот в чем загвоздка. Остатки считаются для любого непрерывного периода, одним подзапросом.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Остатки на предыдущий период и мультиселект SSAS 2008
    #39723954
binro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Andy_OLAP,

А как же работает при мультиселекте FirstChild в качестве свойства меры ( AggregateFunction )?
Да и тот же LastChild - он ведь тоже неаддитивен.
А ведь она ж работает и на дробных (с разрывами) и на сплошных мультивыбранных элементах.
Значит, внутри себя ОЛАП это умеет.
Осталось только научиться имитировать это своими calculate-ми.

В принципе, если версия не урезанная (т.е. не Стандарт, а Ентерпрайз)
, то заявленная проблема может быть решена и без них:
во вьюху добавить колонку именно с остатками на предыдущий день
, оконной функцией они же легко достаются. Ну или джойнить таблицу на саму себя, если версия скуля старая.
Тогда данные при процессинге будут отдаваться "чуток" помедленнее.
А в новой мере соотв-щей выставить агрегацию FirstChild.

Но сложности начинаются на версии Standart :(
Там приходится эмулировать FirstChild при помощи LastChild предыдущего элемента
вот такой кусок почти решает задачу:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
scope ([Measures].[Ост нач]);
    scope ([Календарь].[Дата].[Дата]);
        THIS=( [Measures].[Остаток на конец] 
             , [Календарь].[Дата].prevmember
             );
    end scope;
    scope ([Календарь].[Год-Месяц-День].members );            
        THIS = ([Measures].[Остаток на конец]
            , [Календарь].[Год-Месяц-День].PrevMember
    );
    end scope;            
    scope ([Календарь].[Месяцы].[Месяцы] );
        THIS=( [Measures].[Остаток на конец] 
             , [Календарь].[Месяцы].prevmember
             );
    end scope;
end scope;



И даже на мультиселекте работает, - но неверно работает.
вот так вот это выглядит (в мультиселекте выбраны ровно те даты, которые тут показаны):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
			Ост на нач.	Ост на конец
I  кв.					105 423
II  кв.	Апрель	Апр, 3	105 291		330 856
		Апр, 4	330 856		254 159
	Апрель Итог	105 423		254 159
	Май	Май, 15	139 964		139 837
		Май, 16	139 837		139 666
		Май, 17	139 666		352 118
		Май, 18	352 118		152 872
		Май, 31	305 198		6 371
	Май Итог	351 081		6 371
	Июнь	Июн, 13	1 862		1 869
		Июн, 14	1 869		1 869
		Июн, 15	1 869		1 865
	Июнь Итог	6 371		1 865
II  кв. Итог		105 423		1 865

Итог за июнь берется не 1862 (первый в выбранном множестве), а 6371 - последний за МАЙ .
А итог за квартал - не запись за 3-е апреля, а запись на конец 1-го квартала.
ну и т.д.

Andy_OLAP, может, подскажете, как при помощи intersect и existing найти потомков для итоговых строк
, чтобы уже среди них брать HEAD?
...
Рейтинг: 0 / 0
Остатки на предыдущий период и мультиселект SSAS 2008
    #39724076
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
binro,
У Вас получается, что на дату - ключевой атрибут - Вы переопределяете как prevmember. Но для мультиселекта этот currentmember есть All, а что от него есть prevmember - таки никто не знает.
Код: sql
1.
2.
3.
4.
5.
6.
scope ([Measures].[Ост нач]);
    scope ([Календарь].[Дата].[Дата]);
        THIS=( [Measures].[Остаток на конец] 
             , [Календарь].[Дата].prevmember
             );
    end scope;



Поэтому можно сделать так.
Код: sql
1.
2.
3.
4.
create hidden dynamic set [ExistingDays] as existing [Календарь].[Дата].[Дата];
scope ([Measures].[Ост нач],[Календарь].[Дата].[Дата]);
this = ([Measures].[Остаток на конец], [ExistingDays].item([ExistingDays].count-1); // предыдущий день в выборке
end scope;


Но тут возникает вопрос - у Вас пользователь выбрал галочками 1 и 3 января. Физически фильтром в шапке сводной таблицы. Это то, что уходит в where, так? Начальный остаток на 3 января - это конечный остаток на 2 января, который отличается от конечного остатка на 1 января. А у Вас это 2 января отсекается.

Поэтому по сути нужно 2 физические меры и 2 scope переопределения сразу.
Код: sql
1.
2.
([Measures].[Остаток на конец],[Календарь].[Дата].[Дата]) = iif(что-то, складываем промежуточный начальный остаток и сумму движений,null);
([Measures].[Остаток на конец],[Календарь].[Дата].[Дата]) = iif(что-то, складываем промежуточный начальный остаток и сумму движений но для даты [Календарь].[Дата].currentmember.lag(1) или для даты (existing [ExistingDays]).item(0).lag(1) или еще как-нибудь по экспериментам и тестированию,null);



Весь смысл функционала enterprise - это явная работа last-non-empty, даже если галочками выбрали несколько дней внутри периода с дырками между выбранными днями. И обходить это с помощью формул - себе дороже, чем купить лицензию. Впрочем, если шекелей нет - можно быть жадным, бедным и находчивым :)
...
Рейтинг: 0 / 0
Остатки на предыдущий период и мультиселект SSAS 2008
    #39724077
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andy_OLAP,
Имелось в виду конечно же
Код: sql
1.
2.
([Measures].[Остаток на конец],[Календарь].[Дата].[Дата]) = iif(что-то, складываем промежуточный начальный остаток и сумму движений,null);
([Measures].[Ост нач],[Календарь].[Дата].[Дата]) = iif(что-то, складываем промежуточный начальный остаток и сумму движений но для даты [Календарь].[Дата].currentmember.lag(1) или для даты (existing [ExistingDays]).item(0).lag(1) или еще как-нибудь по экспериментам и тестированию,null);
...
Рейтинг: 0 / 0
Остатки на предыдущий период и мультиселект SSAS 2008
    #39724130
binro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Andy_OLAP,

судя по некоторым изысканиям, текущий элемент при мультиселекте иногда таки определен.

Вот смотрите , что получилось:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
-- тут почему-то existing не играет роли :
create dynamic set currentcube.[sChAll] as [Календарь].[Год-Месяц-День].[День];
create calculated member currentcube.measures.[checked_interval] as 
CSTR(head([sChAll]).item(0).properties('name')) + "-" +
CSTR(tail([sChAll]).item(0).properties('name')) ;

-- самая первая дата в измерении
CREATE MEMBER CURRENTCUBE.[Measures].[1st_dt_f_all]
 AS head(          [Календарь].[Год-Месяц-День].[День]).item(0).properties('name')
;
-- самая первая дата в измерении + existing 
CREATE MEMBER CURRENTCUBE.[Measures].[1st_dt_ex_mem]
 AS head( existing [Календарь].[Год-Месяц-День].[День]).item(0).properties('name')
;
-- первая дата в измерении, но взятая из динамического набора
CREATE MEMBER CURRENTCUBE.[Measures].[1st_dt_f_set]
 AS head( sChAll ).item(0).properties('name')
;
-- потомки текущего элемента (т.е. не всегда он при мультиселекте - ALL, выходит )
CREATE MEMBER CURRENTCUBE.[Measures].[chld_of_curr]
 AS head(          [Календарь].[Год-Месяц-День].currentmember.children).item(0).properties('name')
;
CREATE MEMBER CURRENTCUBE.[Measures].[chld_of_curr_ex]
 AS head( existing [Календарь].[Год-Месяц-День].currentmember.children).item(0).properties('name')
;
-- пересечение потомков (определяются верно) и "выбранных пользователем" :
CREATE MEMBER CURRENTCUBE.[Measures].[1st_chld_of_curr]
 AS head( intersect( existing [Календарь].[Год-Месяц-День].currentmember.children,
     sChAll)).item(0).properties('name')
;
CREATE MEMBER CURRENTCUBE.[Measures].[PREV_of_curr]
 AS head( intersect( existing [Календарь].[Год-Месяц-День].currentmember.children,
     sChAll)).item(0).PrevMember.name
;

scope ([Measures].[Ост нач]);
    scope ([Календарь].[Дата].[Дата]);
        THIS=( [Measures].[Остаток вал на конец Ф] 
             , [Календарь].[Дата].prevmember
             );
    end scope;
    scope ([Календарь].[Год-Месяц-День].members );            
        THIS = ([Measures].[Остаток вал на конец Ф]
             , iif( isleaf([Календарь].[Год-Месяц-День])
-- если дата, то просто предыдущую дату
    , [Календарь].[Год-Месяц-День].prevmember
-- если нет, то учитываем мультиселект :
                , head( intersect( [Календарь].[Год-Месяц-День].currentmember.children,
                    sChAll)).item(0).PrevMember
        )
    );
    end scope;            
    end scope;
end scope;



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

А выглядит результат так : см. картинку.
(числа - те же, что в предыдущем примере, - можно увидеть, что "ост на нач" по итогам месяцев, где выбрано несколько дней, стали другими).


Осталось прописать другие уровни иерархии (квартал, год, и вариант, когда отдельно месяцы или годы выводятся
, без иерархии ГКМД).

Шекелей не то чтобы совсем нет, - но поставлена задача их поэкономить :).
И также нет возможности считать остаток как сумму движений, т.к. у нас остаток имеет право поменяться без движения.
Да, так вот :).

Но самое мне непонятное из того, что Вы написали, - а как затрудняет вычисление первого члена наличие "дырок" в последовательности остальных членов?
ведь нас интересует только один, самый первый, - что нам с того, что их там - дальше - то ли пять, то ли сто?
...
Рейтинг: 0 / 0
Остатки на предыдущий период и мультиселект SSAS 2008
    #39724208
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
binroAndy_OLAP,

судя по некоторым изысканиям, текущий элемент при мультиселекте иногда таки определен.

Вот смотрите , что получилось:

Код: sql
1.
2.
-- тут почему-то existing не играет роли :
create dynamic set currentcube.[sChAll] as [Календарь].[Год-Месяц-День].[День];





Вы поймите, набор элементов измерения это [Календарь].[Дата].[Дата], а [Календарь].[Год-Месяц-День].[День] - это набор вариантов нижнего уровня иерархии. Набор уровней нужен, чтобы сделать так - когда стоите на дате, можно получить ее месяц [Календарь].[Год-Месяц-День].CurrentMember.Parent и ее год [Календарь].[Год-Месяц-День].CurrentMember.Parent.Parent, а можно получить ее неделю [Календарь].[Год-Неделя-День].CurrentMember.Parent и понедельник этой недели [Календарь].[Год-Неделя-День].CurrentMember.Parent.FirstValue (если все сделали правильно при назначении типов на атрибуты измерения, которые затем легли в уровни иерархий для месяцев и для недель).

Когда Вы пишите [Календарь].[Год-Месяц-День].CurrentMember.Lag(1) - это один день назад для ДАТЫ и один месяц назад для МЕСЯЦА, понимаете? Это зависит от того, где Вы находитесь на иерархии.

binroнесколько промежуточных членов - для иллюстрации некоторых неожиданностей (для меня) работы некоторых функций.

А выглядит результат так : см. картинку.
(числа - те же, что в предыдущем примере, - можно увидеть, что "ост на нач" по итогам месяцев, где выбрано несколько дней, стали другими).


Осталось прописать другие уровни иерархии (квартал, год, и вариант, когда отдельно месяцы или годы выводятся
, без иерархии ГКМД).

Насчет "дырок" - у Вас для месяца мая выбрано 15 и 16 и 18 и 31 мая. Отлично. Вы стоите на мае целиком и получаете внутри набор из 4 элементов, для которых последний и дает окончание мая. Но первый - 15 мая - не дает правильный остаток на начало периода. Это или остаток на 1 мая минус один день вместо 15 мая минус 1 день или мая для 15 мая минус 1 месяц (как остаток на конец всего апреля). А если в апреле тоже дырки, выбраны 2 и 3 апреля - не получится ли остаток на конец апреля как остаток на конец 3 апреля? Вот в чем подвох расчета по existing подсету и item(0) или item(подсет.count-1).

Можно, получив внутри апреля набор из 2 и 3 апреля, понять, что остаток на конец и начало апреля нужно показывать, сделать так - [Календарь].[Год-Месяц-День].CurrentMember.Parent.FirstValue для 1 даты месяца и [Календарь].[Год-Месяц-День].CurrentMember.Parent.LastValue для последней даты месяца или [Календарь].[Год-Месяц-День].CurrentMember.Parent.Lag(1).LastValue для последней даты предыдущего месяца (как начальный остаток на этот месяц апрель). Получить точно key нужного элемента, а затем получить дату как StrToMember("[Календарь].[Дата].[Дата].&["+CStr(key нужного дня типа 20180331)+"]").

Пояснять это долго. Проще показать. Но не проще, мне Вам показывать теоретически можно, да только Вам потом понадобится память стереть :)
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / Остатки на предыдущий период и мультиселект SSAS 2008
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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