powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / MDX. Странное поведение CM.
39 сообщений из 39, показаны все 2 страниц
MDX. Странное поведение CM.
    #35721734
SerLight
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток.

Есть корректно работающий MDX.

Код: plaintext
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.
with 

set ppA as toppercent(nonempty([Goods].[Goods].members) - [Goods].[Goods].[All],  80 ,[Measures].[Quantity])
set ppB as toppercent(nonempty([Goods].[Goods].members) - [Goods].[Goods].[All],  90 ,[Measures].[Quantity])-ppA

member [Measures].ABC as
'iif([Measures].[Quantity]>=min(ppA,[Measures].[Quantity]),"A",
iif([Measures].[Quantity]>=min(ppB,[Measures].[Quantity]),"B",
iif(IsEmpty([Measures].[Quantity]),"o","C")
))'


SELECT 

{[Measures].[Quantity],[Measures].[ABC]} DIMENSION PROPERTIES PARENT_UNIQUE_NAME ON COLUMNS , 

NON EMPTY Hierarchize({DrilldownLevel({[Goods].[Goods].[All]})}) DIMENSION PROPERTIES PARENT_UNIQUE_NAME,

[Goods].[Goods].[Goods].[Cod Firm],
[Goods].[Goods].[Goods].[Departs],
[Goods].[Goods].[Goods].[Departs - Name],
[Goods].[Goods].[Goods].[G Groups],
[Goods].[Goods].[Goods].[G Groups - Name],
[Goods].[Goods].[Goods].[Name Firm],
[Goods].[Goods].[Goods].[Name_],
[Goods].[Goods].[Goods].[S Groups],
[Goods].[Goods].[Goods].[S Groups - Name],
[Goods].[Goods].[Goods].[Size] ON ROWS  
FROM [SalesDynamic] 

WHERE (
	[Time Day].[Hierarchy].[Year].&[ 2008 ].&[Квартал  4 ].&[ 11 ],
	[Goods].[S Groups - Name].&[Пиво в ПЭТ],
	[Shops].[Shops].&[ 101 ]) CELL PROPERTIES VALUE, FORMAT_STRING, LANGUAGE, BACK_COLOR, FORE_COLOR, FONT_FLAGS


Селект вырван профайлером из excel 2007.

Я создаю следующие CM:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CREATE SET CURRENTCUBE.[ppA]
 AS toppercent(nonempty([Goods].[Goods].members),  80 ,[Measures].[Quantity]) ;   
CREATE SET CURRENTCUBE.[ppB]
 AS toppercent(nonempty([Goods].[Goods].members),  90 ,[Measures].[Quantity])-ppA ;   
CREATE MEMBER CURRENTCUBE.[MEASURES].ABC
 AS iif([Measures].[Quantity]>=min(ppA,[Measures].[Quantity]),"A",iif([Measures].[Quantity]>=min(ppB,[Measures].[Quantity]),"B",iif(IsEmpty([Measures].[Quantity]),"o","C"))), 
VISIBLE =  1   ; 

Беру тот же самый запрос а получаю чушь! Везде стоит значение "А" кроме empty элементов(там стоит "о" как и должно быть).

Пожалуйста, подскажите в чем проблема.
...
Рейтинг: 0 / 0
MDX. Странное поведение CM.
    #35721768
SerLight
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Причем сами set'ы неправильные(хотя и при не правильных должны были быть все группы: и "А" и "Б" и "С" и "o")
Ниже set'ы ppA и ppB:
...
Рейтинг: 0 / 0
MDX. Странное поведение CM.
    #35721783
SerLight
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
MDX. Странное поведение CM.
    #35721963
Fec un Tues
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SerLightБеру тот же самый запрос а получаю чушь!
Не вникая в детали предположу, что результат расходится с Вашим ожиданием по той причине, что множества вычисляются в разных контекстах: соответственно с where и без where.
...
Рейтинг: 0 / 0
MDX. Странное поведение CM.
    #35722323
SerLight
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Fec un Tues, может быть я неправильно понял о каком "where" вы говорите, но если о том, что стоит в select'е , то и в MDX скрипте и в запросе посылаемом excel'ем он один и тот же. Собственно я из экселя запрос и вытянул.

Кстати, пробовал в mdx и с подзапросами - работает.
...
Рейтинг: 0 / 0
MDX. Странное поведение CM.
    #35722333
SerLight
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блин. Понял о чем Вы!
...
Рейтинг: 0 / 0
MDX. Странное поведение CM.
    #35732707
Evgenych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Создаю в Visual Studio два именованных множества
[ABC Валовая прибыль A]
Код: plaintext
1.
2.
3.
4.
5.
{TopPercent(
		[Товар].[Наименование].[Наименование].members
		, 75 
		,[Measures].[Валовая прибыль]
	)}
[ABC Валовая прибыль B]
Код: plaintext
1.
2.
3.
4.
5.
{TopPercent(
		[Товар].[Наименование].[Наименование].members
		, 95 
		,[Measures].[Валовая прибыль]
	)}
И вычисляемый член
[ABC Валовая прибыль]
Код: plaintext
1.
2.
3.
4.
5.
case
	when rank([Товар].[Наименование].currentmember, [ABC Валовая прибыль A]) >  0  then  0 
	when rank([Товар].[Наименование].currentmember, [ABC Валовая прибыль B]) >  0  then  1 
        else  2 
	end
Как сделать чтобы сводная таблица excel вычисляла эти множества в контексте своих фильтров, а не по всем товарам (например, пользователь выбрал в фильтре конкретного производителя)?
...
Рейтинг: 0 / 0
MDX. Странное поведение CM.
    #35733212
Evgenych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
(В дополнение к предыдущему посту)
Такой запрос очень сильно тормозит - 6 минут
Код: plaintext
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.
with
member [ABC Валовая прибыль] as
	case
		when
			rank(
				[Товар].[Наименование].currentmember
				,TopPercent(
					[Товар].[Наименование].[Наименование].members
					, 75 
					,[Measures].[Валовая прибыль]
				)
			) >  0  then  0 
		when
			rank(
				[Товар].[Наименование].currentmember
				,TopPercent(
					[Товар].[Наименование].[Наименование].members
					, 95 
					,[Measures].[Валовая прибыль]
				)
			) >  0  then  1 
		else  2 
	end
select
	{
		[Валовая прибыль]
		,[ABC Валовая прибыль]
	} on  0 
	,order(nonEmpty([Товар].[Наименование].[Наименование].members, [Валовая прибыль])
		,[Валовая прибыль], desc) on  1 
from [БизнессПро]
where (
	[Текущая дата].item( 0 ).parent.lag( 2 ):[Текущая дата].item( 0 ).parent.lag( 1 )
	,[Товар].[Производитель - Товар].[atmel]
);

против 2-х секунд с именованными наборами (SSMS)
Код: plaintext
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.
with 
	set [ABC Валовая прибыль A] as
		{TopPercent(
			[Товар].[Наименование].[Наименование].members
			, 75 
			,[Measures].[Валовая прибыль]
		)}
	set [ABC Валовая прибыль B] as 	
		{TopPercent(
			[Товар].[Наименование].[Наименование].members
			, 95 
			,[Measures].[Валовая прибыль]
		)}
	member [ABC Валовая прибыль] as	
		case
			when rank([Товар].[Наименование].currentmember, [ABC Валовая прибыль A]) >  0  then  0 
			when rank([Товар].[Наименование].currentmember, [ABC Валовая прибыль A]) >  1  then  1 
			else  2 
		end
select
	{
		[Валовая прибыль]
		,[ABC Валовая прибыль]
	} on  0 
	,order(nonEmpty([Товар].[Наименование].[Наименование].members, [Валовая прибыль])
		,[Валовая прибыль], desc) on  1 
from [БизнессПро]
where (
	[Текущая дата].item( 0 ).parent.lag( 2 ):[Текущая дата].item( 0 ).parent.lag( 1 )
	,[Товар].[Производитель - Товар].[atmel]
);

Т.е. такой вычисляемый член для использования в excel не подойдет.
...
Рейтинг: 0 / 0
MDX. Странное поведение CM.
    #35737139
SerLight
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поднимаю тему. Несмотря на то что причина неработоспособности моих CM понятна, проблему так и не удалось обуздать. А так как у Evgenych такая же проблема, то все таки прошу помощи уже Нам)
...
Рейтинг: 0 / 0
MDX. Странное поведение CM.
    #35737515
Fec un Tues
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
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.
with
	member [_minA] as
		(
			Tail(
				TopPercent(
					[Товар].[Наименование].Children
					, 75 
					,[Measures].[Валовая прибыль]
				)
			)(  0  )
			,[Measures].[Валовая прибыль]
		)
		
	member [_minB] as
		(
			Tail(
				TopPercent(
					[Товар].[Наименование].Children
					, 95 
					,[Measures].[Валовая прибыль]
				)
			)(  0  )
			,[Measures].[Валовая прибыль]
		)
		
	member [minA] as ( [Товар].[Наименование].Parent, [_minA] )
	
	member [minB] as ( [Товар].[Наименование].Parent, [_minB] )
	
	member [ABC Валовая прибыль] as
		Iif(
			[Measures].[Валовая прибыль] >= [minA]
			,"A"
			,Iif(
				 [Measures].[Валовая прибыль] >= [minB]
				,"B"
				,"C"
			)
		)
		
select
	{
		[Валовая прибыль]
		,[ABC Валовая прибыль]
	} on  0 
	,order(nonEmpty([Товар].[Наименование].[Наименование].members, [Валовая прибыль])
		,[Валовая прибыль], desc) on  1 
from [БизнессПро]
where (
	[Текущая дата].item( 0 ).parent.lag( 2 ):[Текущая дата].item( 0 ).parent.lag( 1 )
	,[Товар].[Производитель - Товар].[atmel]
)

Попробуйте так. Только это будет ABC относительно всех товаров, без учета тех атрибутов товара, которые выставлены в where. Впрочем, в эталонных запросах с set то же самое, потому что не используется Existing.
...
Рейтинг: 0 / 0
MDX. Странное поведение CM.
    #35739585
Evgenych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Fec un Tues, попробовал использовать функцию existing.
Код: plaintext
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.
CREATE SET [БизнессПро].[ABC Валовая прибыль A]
 AS {TopPercent(
		existing([Товар].[Наименование].[Наименование].members)
		, 75 
		,[Measures].[Валовая прибыль]
	)};                
CREATE SET [БизнессПро].[ABC Валовая прибыль B]
 AS {TopPercent(
		existing([Товар].[Наименование].[Наименование].members)
		, 95 
		,[Measures].[Валовая прибыль]
	)};                
CREATE MEMBER [БизнессПро].[MEASURES].[ABC Валовая прибыль]
 AS
case
		when rank([Товар].[Наименование].currentmember, [ABC Валовая прибыль A]) >  0  then  0 
		when rank([Товар].[Наименование].currentmember, [ABC Валовая прибыль B]) >  0  then  1 
        else  2 
	end
go
select
	{
		[Measures].[Валовая прибыль]
		,[MEASURES].[ABC Вал]
	}
	on  0 
	,Order([Товар].[Наименование].[Наименование].Members, [Measures].[Валовая прибыль], desc) on  1 
from [БизнессПро]
where {[Товар].[Вид товара].&[00001w000D]}

Та же проблема.
Как заставить функцию TopPercent "заглянуть" в Where? (когда она используется в контексте сессии, а не запроса)
...
Рейтинг: 0 / 0
MDX. Странное поведение CM.
    #35739876
Fec un Tues
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я с Existing ошибся, TopPercent и так вычисляет с учетом where (когда в контесте запроса).
...
Рейтинг: 0 / 0
MDX. Странное поведение CM.
    #35779489
SerLight
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть!!! Задача решена!))

Решена на SSAS 2008.
В 2005ом можно было использовать только статические сеты которые считаются 1 раз на всю сессию!
Теперь же в 2008ом есть возможность создавать динамические сеты, которые определяются для каждого запроса заново.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE dynamic SET CURRENTCUBE.[ppA]
 AS toppercent(nonempty([goods].[goods].members) - [goods].[goods].[All], 80 ,[Measures].[Quantity]) ;

CREATE dynamic SET CURRENTCUBE.[ppB]
 AS toppercent(nonempty([goods].[goods].members) - [goods].[goods].[All], 90 ,[Measures].[Quantity])-ppA;

CREATE MEMBER CURRENTCUBE.[Measures].ABC
 
AS iif(IsEmpty([Measures].[Quantity]),"o", 

iif([Measures].[Quantity]>=min(ppA,[Measures].[Quantity]),"A",

iif([Measures].[Quantity]>=min(ppB,[Measures].[Quantity]),"B","C"))), 

VISIBLE =  1 ; 
Работает шустро и правильно)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
MDX. Странное поведение CM.
    #37106636
Voyager_lan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerLight,
SSAS 2008 R2.
Столкнулся с "зависанием" ВСЕГО куба: проблема в использовании в кубе динамических сетов на предложенном решении, при том, что их можно и не использовать (строю отчет без них). Выборка любого элемента измерения в фильтре Excel может занять 5-10 сек.
Без динамических сетов все работает шустро (как должно, собственно). В дин. сете используется атрибут на ~60 тыс.элементов для ABC. Теперь проблема с тем, как решить эту задачку. CU не спасли пока.
...
Рейтинг: 0 / 0
MDX. Странное поведение CM.
    #37179042
mihami
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SerLightЕсть!!! Задача решена!))

Решена на SSAS 2008.
В 2005ом можно было использовать только статические сеты которые считаются 1 раз на всю сессию!
Теперь же в 2008ом есть возможность создавать динамические сеты, которые определяются для каждого запроса заново.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE dynamic SET CURRENTCUBE.[ppA]
 AS toppercent(nonempty([goods].[goods].members) - [goods].[goods].[All], 80 ,[Measures].[Quantity]) ;

CREATE dynamic SET CURRENTCUBE.[ppB]
 AS toppercent(nonempty([goods].[goods].members) - [goods].[goods].[All], 90 ,[Measures].[Quantity])-ppA;

CREATE MEMBER CURRENTCUBE.[Measures].ABC
 
AS iif(IsEmpty([Measures].[Quantity]),"o", 

iif([Measures].[Quantity]>=min(ppA,[Measures].[Quantity]),"A",

iif([Measures].[Quantity]>=min(ppB,[Measures].[Quantity]),"B","C"))), 

VISIBLE =  1 ; 
Работает шустро и правильно)
Попробовал Ваш метод - действительно он не привязан к фильтрам и почти правильно формирует эти списки (в ppA входит 80% и 80,01% почемуто но уже не так важно), но есть одна проблема - когда я выполняю его на 300 записях то работает нормально, но когда стал пробовать на 65Гб хранилище то ждал 10 минут и отменил.

Пробовал добавить еще 2 динамических набора вида
Код: plaintext
1.
2.
[src]CREATE dynamic SET CURRENTCUBE.[minA]
min(ppA,[Measures].[Quantity])
чтобы не пересчитывались для каждого мембера минимальное значение ррА, но такой подход не работает. В самом Excel уже пишет "Функция ожидает для аргумента выражение набора кортежей. Было использовано строчное или числовое выражение".

Я практически не знаю MDX, и может этот сет можно доделать както.
Господа прошу вашей помощи.
...
Рейтинг: 0 / 0
MDX. Странное поведение CM.
    #37179190
mihami
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Заменил

Код: plaintext
1.
CREATE dynamic SET CURRENTCUBE.[minA]
min(ppA,[Measures].[Quantity])
на
Код: plaintext
1.
CREATE dynamic SET CURRENTCUBE.[minA]
tail(ppA)
т.к после TOPPERCENT сет уже упорядочен

но когда я пишу

Код: plaintext
iif([Measures].[Quantity]>=minA,"A",

то Excel ругается.
Как сделать ссылку в minA на его же поле [Measures].[Quantity] ?
...
Рейтинг: 0 / 0
MDX. Странное поведение CM.
    #37179755
mihami
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вобщем мое решение для БОООЛЬШИХ кубов:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE hidden DYNAMIC SET CURRENTCUBE.[ppA] AS
TOPPERCENT(NONEMPTY([Item].[Item Name].MEMBERS-[Item].[Item Name].[Все]), 80 ,[Measures].[Amount]);   

CREATE hidden DYNAMIC SET CURRENTCUBE.[ppB] AS
TOPPERCENT(NONEMPTY([Item].[Item Name].MEMBERS-[Item].[Item Name].[Все]), 90 ,[Measures].[Amount])-ppA;

CREATE hidden DYNAMIC SET CURRENTCUBE.[mA]
 AS  tail(ppA);  
 
CREATE hidden DYNAMIC SET CURRENTCUBE.[mB]
 AS  tail(ppB); 

CREATE MEMBER CURRENTCUBE.[Measures].[ABC реализация] AS 
iif(ISEMPTY([Measures].[Amount]),null,
   iif([Measures].[Amount]>sum(mA,[Measures].[Amount]),"A",
      iif([Measures].[Amount]>sum(mB,[Measures].[Amount]),"B","C"))), 
VISIBLE =  1 ;

Причем если сеты сравнивать через MIN
Код: plaintext
1.
iif([Measures].[Quantity]>=min(ppA,[Measures].[Quantity]),"A",
то время обработки вырастает с 1.9 сек до 2.1 сек по сравнению с SUM (тестил на ХД 160 Мб)

Владимир Штепа предлагал использовать через RANK без динамических сетов
Код: plaintext
1.
iif(rank(Product.CurrentMember, toppercent([Product].[Brand Name].members,  80 ,([Store].[All Stores].[USA].[WA], [Measures].CurrentMember))) >  0 , "A", 
и должен с ним не согласится, т.к. время обработки выростает с 1.9 до 11.3 сек.

ИТОГО

когда я воодрузил решение на ХД 107 Гб то получил время обработки запроса 3.4 сек!!!!
Господа это очень хороший результат!!
...
Рейтинг: 0 / 0
MDX. Странное поведение CM.
    #37181064
Fec un Tues
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mihamiВладимир Штепа предлагал использовать через RANK без динамических сетов
Ну, скажем, когда он это предлагал, еще и динамических сетов не было...

mihamiкогда я воодрузил решение на ХД 107 Гб то получил время обработки запроса 3.4 сек!!!!
То, что ХД 107 Гб - это мало о чем говорит. Важен размер иерархии в элементах. На измерении Customer из Adventure Works Ваш вариант действительно гораздо быстрее (на моей древней около 15 секунд), чем тот, на котором остановился SerLight, и, тем не менее, думаю, можно сделать еще быстрее, если немного переписать решение, которое я приводил выше ( 6626346 ).
...
Рейтинг: 0 / 0
MDX. Странное поведение CM.
    #37181078
Voyager_lan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mihamiВобщем мое решение для БОООЛЬШИХ кубов:

Нужно не для для больших кубов, а для больших измерений. Попробуйте свой пример на 100 - 150 тыс. элементах...
...
Рейтинг: 0 / 0
MDX. Странное поведение CM.
    #37181155
Fec un Tues
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Fec un Tuesдумаю, можно сделать еще быстрее, если немного переписать решение, которое я приводил выше ( 6626346 ).
Вот так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
Create hidden dynamic set [setA] as TopPercent(
	 [Customer].[Customer].[Customer]
	, 80 
	,[Internet Sales Amount]
);

Create hidden dynamic set [setB] as TopPercent(
	 [Customer].[Customer].[Customer]
	, 90 
	,[Internet Sales Amount]
);

Create hidden [_minA] = ( Tail( [setA] )(  0  ), [Internet Sales Amount] );
Create hidden [_minB] = ( Tail( [setB] )(  0  ), [Internet Sales Amount] );
Create hidden [minA] = ( [Customer].[Customer].Parent, [_minA] );
Create hidden [minB] = ( [Customer].[Customer].Parent, [_minB] );

Create [Customer Sales ABC];

( [Customer].[Customer].[Customer], [Customer Sales ABC] ) = Case
	when IsEmpty( [Internet Sales Amount] ) then null
	when [Internet Sales Amount] >= [minA] then "A"
	when [Internet Sales Amount] >= [minB] then "B"
	else "C"
end;

Динамические сеты здесь нужны для того, чтобы реагировать на фильтр (в where или subselect), в котором может оказаться какая-нибудь иерархия из Customer.

Но есть проблема, о которой раньше говорил Voyager_lan. Эти динамические сеты замедляют работу Excel. Например, при определении фильтров.
...
Рейтинг: 0 / 0
MDX. Странное поведение CM.
    #37182712
mihami
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Voyager_lanmihamiВобщем мое решение для БОООЛЬШИХ кубов:

Нужно не для для больших кубов, а для больших измерений. Попробуйте свой пример на 100 - 150 тыс. элементах...
В том разрезе товаров что я делал чуть больше 80 тыс. наименований
...
Рейтинг: 0 / 0
MDX. Странное поведение CM.
    #37182757
mihami
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Fec un TuesFec un Tuesдумаю, можно сделать еще быстрее, если немного переписать решение, которое я приводил выше ( 6626346 ).
Код: plaintext
1.
2.
3.
4.
Create hidden [_minA] = ( Tail( [setA] )(  0  ), [Internet Sales Amount] );
Create hidden [_minB] = ( Tail( [setB] )(  0  ), [Internet Sales Amount] );
Create hidden [minA] = ( [Customer].[Customer].Parent, [_minA] );
Create hidden [minB] = ( [Customer].[Customer].Parent, [_minB] );

Динамические сеты здесь нужны для того, чтобы реагировать на фильтр (в where или subselect), в котором может оказаться какая-нибудь иерархия из Customer.

Но есть проблема, о которой раньше говорил Voyager_lan. Эти динамические сеты замедляют работу Excel. Например, при определении фильтров.
Разница между моим и Вашим кодом в использовании ( [Customer].[Customer].Parent, [_minA] ) вместо sum на наборе из 1го элемента. Так работает быстрее? (по идее должно быть так) Я просто пока начинающий в этом деле ))

Вопрос с задержкой при выборе фильтров присутствует, но не в таких временных диапазонах как говорил Voyager_lan. Но заметил интересную особенность: эти задержки в 2010 Excel больше чем в 2007 (как это ни странно!) и в 2007 они есть только при первом обращении к фильтру, а при последующих их нет вообще.
...
Рейтинг: 0 / 0
MDX. Странное поведение CM.
    #37182789
mihami
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Господа.

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

Строить прямые MDX запросы для куба я толком не понял как, да и не могу выбрать все поля что мне надо.
Пробовал через SSIS используя ADO.NET подлючение к Analysis Services как источник с запросом:

Код: plaintext
1.
2.
3.
select [Measures].[ABC реализация] on columns,
[Item].[Item Name].MEMBERS on rows
from [SalesCube]
where ([Date Key].[Year Mounth].&[Г2011 Январь],[Apteki].[Apteka Name].&[Ахматової (Київ)])
но я не могу понять как можно пройтись списком по [Apteka Name] и + к этому изменить запрос в источнике вроде нельзя.

Пока остановился на таком решении:
в Excel написал макрос (VBA) который меняет фильтры в таблице и записывает данные на другой лист. Потом подлючаюсь через SSIS
к книге Excel и работаю с ней. Время выполнения задачи в Excel'ле 34-35 сек, но не устраивает то, что всеравно необходима ручная работа (открыть книгу, запустить макрос, сохранить книгу, запустить SSIS пакет).

Господа, есть ли идеи?
...
Рейтинг: 0 / 0
MDX. Странное поведение CM.
    #37182813
Fec un Tues
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это уже даже не off-topic, а off-off-topic.
...
Рейтинг: 0 / 0
MDX. Странное поведение CM.
    #37267023
mihami
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SerLightЕсть!!! Задача решена!))

Решена на SSAS 2008.
В 2005ом можно было использовать только статические сеты которые считаются 1 раз на всю сессию!
Теперь же в 2008ом есть возможность создавать динамические сеты, которые определяются для каждого запроса заново.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE dynamic SET CURRENTCUBE.[ppA]
 AS toppercent(nonempty([goods].[goods].members) - [goods].[goods].[All], 80 ,[Measures].[Quantity]) ;

CREATE dynamic SET CURRENTCUBE.[ppB]
 AS toppercent(nonempty([goods].[goods].members) - [goods].[goods].[All], 90 ,[Measures].[Quantity])-ppA;

CREATE MEMBER CURRENTCUBE.[Measures].ABC
 
AS iif(IsEmpty([Measures].[Quantity]),"o", 

iif([Measures].[Quantity]>=min(ppA,[Measures].[Quantity]),"A",

iif([Measures].[Quantity]>=min(ppB,[Measures].[Quantity]),"B","C"))), 

VISIBLE =  1 ; 
Работает шустро и правильно)

Реализовал у себя подобный вариант (выше писал его особенности), все работает нормально. Кидаю в строки товары, после кидания в фильтр нар. "магазин" то перечень товаров уменьшается, что говорит о том что динамический сет пашет правильно. Добавляю в фильтр дату - все ОК.

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

Честно говоря сижу в раздумии.... или надо дописать че в MDX или неправильно сделано измерение "группа товара", хотя продажи сожно смотреть нормально и как бы практика в этом есть.

Может есть у кого идеи или куда хоть смотреть?
...
Рейтинг: 0 / 0
MDX. Странное поведение CM.
    #37267099
Fec un Tues
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mihami,

а есть ли возможность упростить вопрос, перейдя к конкретному MDX запросу для Adventure Works?
...
Рейтинг: 0 / 0
MDX. Странное поведение CM.
    #37267134
mihami
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Fec un Tues,

вот мои сеты
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE hidden DYNAMIC SET CURRENTCUBE.[ppA] AS
TOPPERCENT(NONEMPTY([Item].[Item Name].MEMBERS-[Item].[Item Name].[Все]), 80 ,[Measures].[Amount]);   

CREATE hidden DYNAMIC SET CURRENTCUBE.[ppB] AS
TOPPERCENT(NONEMPTY([Item].[Item Name].MEMBERS-[Item].[Item Name].[Все]), 90 ,[Measures].[Amount])-ppA;

CREATE hidden DYNAMIC SET CURRENTCUBE.[mA]
 AS  tail(ppA);  
 
CREATE hidden DYNAMIC SET CURRENTCUBE.[mB]
 AS  tail(ppB); 

CREATE MEMBER CURRENTCUBE.[Measures].[ABC реализация] AS 
iif(ISEMPTY([Measures].[Amount]),null,
   iif([Measures].[Amount]>sum(mA,[Measures].[Amount]),"A",
      iif([Measures].[Amount]>sum(mB,[Measures].[Amount]),"B","C"))), 
VISIBLE =  1 ;
...
Рейтинг: 0 / 0
MDX. Странное поведение CM.
    #37267185
Fec un Tues
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И все-таки. Если перейти к Adventure Works, сразу станет ясно, в вычислениях дело или в чем-то другом.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
MDX. Странное поведение CM.
    #38018166
Добрый день! Реализовал ABC-анализ по аналогии с данным примером и столкнулся с следующей ситуацией: Динамические сеты используемые в расчете ABC-анализа стали значительно тормозить время создания или открытия других отчетов. При этом если исключить DYNAMIC SET на обычный, то все тормоза пропадают, но ABC-анализ не отрабатывает с фильтрацией по иерархии товаров. Кто нибудь сталкивался с данной задачей?!?! Если да то подскажите решение. Заранее спасибо!!!

mihamiВобщем мое решение для БОООЛЬШИХ кубов:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE hidden DYNAMIC SET CURRENTCUBE.[ppA] AS
TOPPERCENT(NONEMPTY([Item].[Item Name].MEMBERS-[Item].[Item Name].[Все]),80,[Measures].[Amount]);   

CREATE hidden DYNAMIC SET CURRENTCUBE.[ppB] AS
TOPPERCENT(NONEMPTY([Item].[Item Name].MEMBERS-[Item].[Item Name].[Все]),90,[Measures].[Amount])-ppA;

CREATE hidden DYNAMIC SET CURRENTCUBE.[mA]
 AS  tail(ppA);  
 
CREATE hidden DYNAMIC SET CURRENTCUBE.[mB]
 AS  tail(ppB); 

CREATE MEMBER CURRENTCUBE.[Measures].[ABC реализация] AS 
iif(ISEMPTY([Measures].[Amount]),null,
   iif([Measures].[Amount]>sum(mA,[Measures].[Amount]),"A",
      iif([Measures].[Amount]>sum(mB,[Measures].[Amount]),"B","C"))), 
VISIBLE = 1;



Причем если сеты сравнивать через MIN
Код: sql
1.
iif([Measures].[Quantity]>=min(ppA,[Measures].[Quantity]),"A",


то время обработки вырастает с 1.9 сек до 2.1 сек по сравнению с SUM (тестил на ХД 160 Мб)

Владимир Штепа предлагал использовать через RANK без динамических сетов
Код: sql
1.
iif(rank(Product.CurrentMember, toppercent([Product].[Brand Name].members, 80,([Store].[All Stores].[USA].[WA], [Measures].CurrentMember))) > 0, "A", 


и должен с ним не согласится, т.к. время обработки выростает с 1.9 до 11.3 сек.

ИТОГО

когда я воодрузил решение на ХД 107 Гб то получил время обработки запроса 3.4 сек!!!!
Господа это очень хороший результат!!
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
MDX. Странное поведение CM.
    #39423783
n0isy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.

Проблема торможения других запросов решается через ХАК:
http://rubicon.azurewebsites.net/2014/08/05/abc-анализ-в-sql-server-analysis-services-практическое-руководс/

Велосипед не мой, так как нет желания переписывать RegexIsMatch, то сделано через IsLike. (В AS влит стандартный ASSP):

Код: sql
1.
2.
3.
4.
5.
6.
CREATE HIDDEN DYNAMIC SET CURRENTCUBE.[B,15%]
 AS 
IIF(ASSP.CurrentCommandIsDiscover(), { },
IIF(ASSP.IsLike(ASSP.GetCurrentCommand(), "%ABC%"),
    TopPercent([Товары].[Товар].MEMBERS, 95, [Measures].[СуммаРеализации])
, { }));       




Если у кого есть ASSP с вышеназванной функцией, или объявится автор - прошу его выложить.
...
Рейтинг: 0 / 0
MDX. Странное поведение CM.
    #39423785
n0isy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос с ABC не закрыт:

Предложенное решение работает с текущими фильтрами, но без учёта столбцов, для разных объектов учёта(Иван, Петя) может быть разный ранг и разный ABC. (Иван хорошо продал яблоко - для него ранг 1 по яблоку, Петя продал персик - для него ранг 1 по персику).

Так как я только начал разбираться прошу сообщество о помощи для решения такой тривиальной для бизнеса задачи, как ABC-анализ в разрезе объектов учёта.
...
Рейтинг: 0 / 0
MDX. Странное поведение CM.
    #39423872
Фотография vikkiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
n0isy,

Может разочарую но ни в этой теме, ни в приведённой ссылке совсем не ABC анализ а однофакторный TopCount или TopSum, поэтому для начала рекомендую разобраться с его теоретической бизнес-сутью и потом приступать к поиску технической реализации (которая к стати на этом форуме уже приводилась).
...
Рейтинг: 0 / 0
MDX. Странное поведение CM.
    #39423884
n0isy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vikkiv,

Вот. Вы умными словами сказали что я и описал в прошлом сообщении. Приемлемого по скорости ABC не нашёл. Буду благодарен, если поможете в этом.
...
Рейтинг: 0 / 0
MDX. Странное поведение CM.
    #39423966
Фотография vikkiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
n0isy,

концептуально (и по быстрому скопированно от сюда 18968217 ) вот так можно реализовать:
Код: sql
1.
2.
3.
4.
5.
6.
7.
with set a as order(product.product.children,[Internet Sales Amount],bdesc)--отсортированный список продуктов
member b as rank(product.product.currentmember,a)--ранг продукта в номенклатуре
member c as sum(head(a,b),[Internet Sales Amount])--нарастающий итог
member d as b/a.count,format="percent"---процент от количества номенклатуры 
member e as c/sum(a,[Internet Sales Amount]),format="percent"--процент кумулятивной суммы в общих продажах
member f as case when d<=0.2 and e<=0.5 then'A'when d<=0.6 and e<=0.85 then'B'else'C'end---АБЦ классификация
select{[Internet Sales Amount],b,c,d,e,f}on 0,a on 1from[Adventure Works]


но на самом деле зависит от того что ты подразумеваешь под столбцами, даже если встраиваешь в меры на стороне куба то по идее считается в текущем (остальное null) контексте (from/where currentmember), остальное уже от клиентского приложения зависит - как оно формирует запрос..
в принципе у меня на наборах из тысяч продуктов/клиентов (или что там другое под анализ попадает) отрабатывает за секунды (хотя и очевидно что в cell-by-cell режиме)..
вечером вернусь и если время останется может что-то перепишу попроизводительней (напр. там сразу видно что count и второе sum можно кэшировать через промежуточное [All].., к set для сжатия лучше применить nonempty если продаж по многим продуктам нет.. и пр.)
...
Рейтинг: 0 / 0
MDX. Странное поведение CM.
    #39424059
n0isy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vikkiv,
Пожоже тормозит подсчёт C. Не дождался
правильно ли я понимаю, что при расчёте RunningSum в C, для каждого tuple из A суммируются все элементы от первого до текущего? Получается O^3 алгоритм?
...
Рейтинг: 0 / 0
MDX. Странное поведение CM.
    #39424227
Фотография vikkiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
n0isy,

Так указано-же на nonempty и кеширование (Total/Sum и Count)..
вот немного оптимизированный запрос - разница в скорости - последний выполняется за долю (0.0024) или четверть процента (0.24%) от начального
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with set a as order(nonempty(product.product.children,[Internet Sales Amount]),[Internet Sales Amount],bdesc)--отсортированный список продуктов
member b as a.count--количество продуктов в наборе
member c as(product.product.parent,b)--кеширование количества
member d as rank(product.product.currentmember,a)--ранг продукта в номенклатуре
member e as sum(head(a,d),[Internet Sales Amount])--нарастающий итог
member f as d/c,format="percent"--процент от количества номенклатуры 
member g as sum(a,[Internet Sales Amount])--общий итог
member h as (product.product.parent,g)--кэширование общего итога
member i as e/h,format="percent"--процент кумулятивной суммы в общих продажах
member j as case when f<=0.2and i<=0.5then'A'when f<=0.6and i<=0.85then'B'else'C'end---ABC классификация
select{[Internet Sales Amount],d,e,f,i,j}on 0,a on 1from[Adventure Works]--конечный запрос



с лева время на выполнение первичного, с права новый запрос



хотя доля прироста производительности за счёт кэширования в данном случае не такая высокая, в основном играет роль nonempty
...
Рейтинг: 0 / 0
MDX. Странное поведение CM.
    #39424233
Фотография vikkiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
наверное можно ещё нарастающий итог / кумулятивную сумму как-то оптимизировать - видел много где мелькает в блогах, но есть-ли подобное для такого отсортированного набора другой вопрос.

причём это время выполнения у меня на лаптопе (правда с SSD), не сервере может побыстрее будет (хотя тестовые кубы маленькие - всё равно всё в памяти и нагрузка на CPU при таких малых измерениях не такая большая)
...
Рейтинг: 0 / 0
MDX. Странное поведение CM.
    #39424331
Фотография vikkiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
n0isyvikkiv,
....
правильно ли я понимаю, что при расчёте RunningSum в C, для каждого tuple из A суммируются все элементы от первого до текущего? Получается O^3 алгоритм?Да, это суть нарастающего итога к сожалению, один из гвоздей в колесо (rank тоже не самая резвая функция)..
...
Рейтинг: 0 / 0
MDX. Странное поведение CM.
    #39424408
n0isy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vikkiv,

Благодарю за развёрнутый ответ!
Эксперименты показали, что CREATE DYNAMIC SET на сервере и WITH SET.. в запросе это вещи разные, завтра продолжу разбираться.
...
Рейтинг: 0 / 0
39 сообщений из 39, показаны все 2 страниц
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / MDX. Странное поведение CM.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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