Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / Сделать MDX-запрос более динамичным / 8 сообщений из 8, страница 1 из 1
02.06.2019, 14:45
    #39821312
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сделать MDX-запрос более динамичным
Здравствуйте!

Есть такая простая задачка. Нужно выгрузить ТТ, у которых не было отгрузок с января по апрель 2019, но появились в мае 2019.

Для этого нужно выгрузить все ТТ, которые отгружались в каком то месяце, а потом определять новая или не новая ТТ.

Написал такой запрос
1-й вариант
Код: 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.
WITH
MEMBER [Время].[Месяц].[Предыдущий период] AS
	AGGREGATE([Время].[Месяц].&[2019-01-01T00:00:00]:
                           [Время].[Месяц].&[2019-04-01T00:00:00])
MEMBER [Measures].[Предыдущий период Отгрузки количество ТТ] AS
	SUM([Время].[Месяц].[Предыдущий период],
		[Measures].[Отгрузки количество ТТ])
MEMBER [Measures].[Анализируемый период Отгрузки количество ТТ] AS
	SUM([Время].[Месяц].&[2019-05-01T00:00:00],
		[Measures].[Отгрузки количество ТТ])
MEMBER [Measures].[Новая ТТ] AS
	(CASE WHEN
		[Measures].[Предыдущий период Отгрузки количество ТТ]  = 0
		AND
		[Measures].[Анализируемый период Отгрузки количество ТТ] > 0
		THEN
			'Да'
		END)
SELECT
	{[Measures].[Предыдущий период Отгрузки количество ТТ],
	[Measures].[Анализируемый период Отгрузки количество ТТ],
	[Measures].[Новая ТТ]}
ON 0,
NON EMPTY
	[Города].[Город].[Город]*
	[Торговые точки].[Регион ТТ].[Регион ТТ]*
	[Торговые точки].[Код ТТ].[Код ТТ]
ON 1
FROM
	(SELECT
		([Время].[Месяц].&[2019-01-01T00:00:00]:[Время].[Месяц].&[2019-05-01T00:00:00],
		[Торговые точки].[Тип клиента].&[2]		
		) ON 0 FROM PROFIT)

Время выполнения 6 минут 12 секунд при выгрузке 38 000 строк.

Если написать по другому
2-й вараинт
Код: 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.
55.
56.
WITH
MEMBER [Measures].[Месяц1 Отгрузки количество ТТ] AS
	SUM([Время].[Месяц].&[2019-01-01T00:00:00],
		[Measures].[Отгрузки количество ТТ])
MEMBER [Measures].[Месяц2 Отгрузки количество ТТ] AS
	SUM([Время].[Месяц].&[2019-02-01T00:00:00],
		[Measures].[Отгрузки количество ТТ])
MEMBER [Measures].[Месяц3 Отгрузки количество ТТ] AS
	SUM([Время].[Месяц].&[2019-03-01T00:00:00],
		[Measures].[Отгрузки количество ТТ])
MEMBER [Measures].[Месяц4 Отгрузки количество ТТ] AS
	SUM([Время].[Месяц].&[2019-04-01T00:00:00],
		[Measures].[Отгрузки количество ТТ])
MEMBER [Measures].[Предыдущие месяцы Отгрузки количество ТТ] AS
	(CASE WHEN
	[Measures].[Месяц1 Отгрузки количество ТТ] = 1
	OR
	[Measures].[Месяц2 Отгрузки количество ТТ] = 1
	OR
	[Measures].[Месяц3 Отгрузки количество ТТ] = 1 
	OR
	[Measures].[Месяц4 Отгрузки количество ТТ] = 1
	THEN
		1
	ELSE
		null
	END)
MEMBER [Measures].[Месяц5 Отгрузки количество ТТ] AS
	SUM([Время].[Месяц].&[2019-05-01T00:00:00],
		[Measures].[Отгрузки количество ТТ])
MEMBER [Measures].[Новая ТТ] AS
	(CASE WHEN
		[Measures].[Предыдущие месяцы Отгрузки количество ТТ] = 0
		AND
		[Measures].[Месяц5 Отгрузки количество ТТ] > 0
		THEN
			'Да'		
	END)
		
SELECT
	{[Measures].[Предыдущие месяцы Отгрузки количество ТТ],
	[Measures].[Месяц5 Отгрузки количество ТТ],
	[Measures].[Новая ТТ]}
ON 0,
NON EMPTY
	[Города].[Город].[Город]*
	[Торговые точки].[Регион ТТ].[Регион ТТ]*
	[Торговые точки].[Код ТТ].[Код ТТ]
HAVING
	[Measures].[Отгрузки количество ТТ] > 0
ON 1
FROM
	(SELECT
		([Время].[Месяц].&[2019-01-01T00:00:00]:[Время].[Месяц].&[2019-05-01T00:00:00],
		[Торговые точки].[Тип клиента].&[2]	
		) ON 0 FROM PROFIT)

Время выполнения 31 сек. при выгрузке 38 000 строк.

Но второй вариант не динамичен. Если надо будет добавить еще месяц, то нужно корректировать запрос в разных местах. То есть май попадает в предыдущий период (добавляется MEMBER), в MEMBER [Предыдущие месяцы Отгрузки количество ТТ] добавляем слагаемое, а июнь как анализируемый делаем.

Скажите, как можно оптимальнее и динамичнее написать?
...
Рейтинг: 0 / 0
03.06.2019, 04:32
    #39821442
Критик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сделать MDX-запрос более динамичным
ferzmikk,

А в чем причина использования именно куба?
Почему не adhoc-запрос в базу?
...
Рейтинг: 0 / 0
03.06.2019, 10:28
    #39821520
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сделать MDX-запрос более динамичным
Критикferzmikk,

А в чем причина использования именно куба?Потому что все отчеты выгружаются из куба.
Почему не adhoc-запрос в базу?Если Вы имеете ввиду использование SQL функции как OPENROWSET, то как вариант.
...
Рейтинг: 0 / 0
05.06.2019, 07:46
    #39822602
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сделать MDX-запрос более динамичным
Почему из за функции Aggregate запрос так сильно тормозит? Может что то нужно добавить к записи?
...
Рейтинг: 0 / 0
05.06.2019, 07:56
    #39822603
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сделать MDX-запрос более динамичным
Если так напишу
Код: sql
1.
2.
3.
4.
5.
6.
7.
...
NON EMPTY
	[Города].[Регион города].[Регион города]*
	[Торговые точки].[Регион ТТ].[Регион ТТ]*
	[Торговые точки].[Код ТТ].[Код ТТ]*	
	[Продукция].[Код продукции].&[00001]
...


то выгружает за 2 секунды

Если так написать
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
WITH	
MEMBER [Продукция].[Код продукции].[Продукция 1] AS
	AGGREGATE({[Продукция].[Код продукции].&[00001]})
...
NON EMPTY
	[Города].[Регион города].[Регион города]*
	[Торговые точки].[Регион ТТ].[Регион ТТ]*
	[Торговые точки].[Код ТТ].[Код ТТ]*		
	[Продукция].[Код продукции].[Продукция 1] 
...


то очень очень долго грузит
...
Рейтинг: 0 / 0
05.06.2019, 14:15
    #39822837
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сделать MDX-запрос более динамичным
ferzmikkто очень очень долго грузитПочему так долго грузит? Как можно ускорить?
...
Рейтинг: 0 / 0
05.06.2019, 15:06
    #39822881
Alex_496
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сделать MDX-запрос более динамичным
ferzmikk,

декартово произведение в MDX-запросе.

Предположу, что измерение [Торговые точки] требует оптимизации.
Кроме того, можно использовать Properties


Критик
правильно предлагает - за подъемом данных с детального уровня, особенно по большим массивам, быстрее будет SQL, а лучше параметризованная хранимая процедура в реляционную базу.

Звучит слово "Выгрузить", следовательно, скорее всего, в Excel. Если так, то максимально отключить форматирование
...
Рейтинг: 0 / 0
06.06.2019, 10:03
    #39823266
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сделать MDX-запрос более динамичным
Alex_496декартово произведение в MDX-запросе.Возможно в запросе это как то оптимизировать?
Кроме того, можно использовать PropertiesЧтобы через атрибут [Торговые точки].[Код ТТ].[Код ТТ] вытащить свойство типа атрибут [Торговые точки].[Регион ТТ].[Регион ТТ] ?

Как можно написать запрос, чтобы получить все свойства по каждому имеющемуся атрибуту?
...
Рейтинг: 0 / 0
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / Сделать MDX-запрос более динамичным / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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