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


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

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

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

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



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

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

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

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

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

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



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

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

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

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

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

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

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

Но если галочками Вы выбрали 2 квартала - вот считается мера остатка на декабрь 2012, мера на март 2013, что в куб возвращать из OLAPа? Ведь это будут 2 подзапроса, которые друг о друге ничего не знают, а сложить как сумму нельзя - мера не аддитивная.
Вот в чем загвоздка. Остатки считаются для любого непрерывного периода, одним подзапросом.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
27.10.2018, 22:19
    #39723954
binro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Остатки на предыдущий период и мультиселект SSAS 2008
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
28.10.2018, 14:33
    #39724076
Andy_OLAP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Остатки на предыдущий период и мультиселект SSAS 2008
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
28.10.2018, 14:33
    #39724077
Andy_OLAP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Остатки на предыдущий период и мультиселект SSAS 2008
Andy_OLAP,
Имелось в виду конечно же
Код: sql
1.
2.
([Measures].[Остаток на конец],[Календарь].[Дата].[Дата]) = iif(что-то, складываем промежуточный начальный остаток и сумму движений,null);
([Measures].[Ост нач],[Календарь].[Дата].[Дата]) = iif(что-то, складываем промежуточный начальный остаток и сумму движений но для даты [Календарь].[Дата].currentmember.lag(1) или для даты (existing [ExistingDays]).item(0).lag(1) или еще как-нибудь по экспериментам и тестированию,null);
...
Рейтинг: 0 / 0
28.10.2018, 18:30
    #39724130
binro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Остатки на предыдущий период и мультиселект SSAS 2008
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
29.10.2018, 00:42
    #39724208
Andy_OLAP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Остатки на предыдущий период и мультиселект SSAS 2008
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
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / Остатки на предыдущий период и мультиселект SSAS 2008 / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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