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

Есть такая простая задачка. Нужно выгрузить ТТ, у которых не было отгрузок с января по апрель 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
Сделать MDX-запрос более динамичным
    #39821442
Фотография Критик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

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

А в чем причина использования именно куба?Потому что все отчеты выгружаются из куба.
Почему не adhoc-запрос в базу?Если Вы имеете ввиду использование SQL функции как OPENROWSET, то как вариант.
...
Рейтинг: 0 / 0
Сделать MDX-запрос более динамичным
    #39822602
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему из за функции Aggregate запрос так сильно тормозит? Может что то нужно добавить к записи?
...
Рейтинг: 0 / 0
Сделать MDX-запрос более динамичным
    #39822603
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если так напишу
Код: 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
Сделать MDX-запрос более динамичным
    #39822837
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikkто очень очень долго грузитПочему так долго грузит? Как можно ускорить?
...
Рейтинг: 0 / 0
Сделать MDX-запрос более динамичным
    #39822881
Фотография Alex_496
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

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

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


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

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

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


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