powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / MDX. Странное поведение CM.
25 сообщений из 39, страница 1 из 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
25 сообщений из 39, страница 1 из 2
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / MDX. Странное поведение CM.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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