Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / OLAP и DWH Новый топик    Ответить
 Вопрос по MDX-запросу.  [new]
ferzmikk
Member

Откуда:
Сообщений: 1575
Здравствуйте!

Есть MDX-запрос
+MDX-запрос
WITH
MEMBER [Цена] AS
	(CASE WHEN [Measures].[Отгрузки шт]<>0 THEN
		[Measures].[Отгрузки сумма без НДС]/[Measures].[Отгрузки шт]
	END)
SELECT
	{[Measures].[Отгрузки шт],
	[Measures].[Отгрузки сумма без НДС],	
	[Цена]}
ON 0,	
	NONEMPTY([Торговые точки].[Код ТТ].[Код ТТ],[Measures].[Отгрузки шт])*
	NONEMPTY([Продукция].[Код продукции].[Код продукции],[Measures].[Отгрузки шт])*	
	[Время].[Дата].[Дата]
ON 1
FROM
	(SELECT
		([Время].[Месяц].&[2018-01-01T00:00:00]:[Время].[Месяц].&[2018-05-01T00:00:00],
		[Торговые точки].[Код ТТ].&[00001ГРД1],
		[Продукция].[Код продукции].&[00001]
		) ON 0
	FROM
		PROFIT)

Получаем такой результат по дням
Код ТТКод продукцииДатаОтгрузки штОтгрузки сумма без НДСЦена
Код ТТ1Код продукции101.01.20181100100
Код ТТ1Код продукции102.01.20181100100
Код ТТ1Код продукции103.01.2018nullnullnull
Код ТТ1Код продукции104.01.2018216080
Код ТТ1Код продукции105.01.2018324080
Код ТТ1Код продукции106.01.20181100100
..................

Но тут задачка интересная, которую решаю. Нужно промаркировать строки, где идет снижение цены от базовой цены больше чем на 9%. То есть маркируем акции. Написал MDX-запрос и завис.

+MDX-запрос
WITH
MEMBER [Дельта] AS 0.09
MEMBER [Цена] AS
	(CASE WHEN [Measures].[Отгрузки шт]<>0 THEN
		[Measures].[Отгрузки сумма без НДС]/[Measures].[Отгрузки шт]
	END)
MEMBER [Предыдущая цена] AS //?
	(CASE WHEN [Цена] = NULL THEN
		[Предыдущая цена]
	ELSE
		([Время].[Дата].CurrentMember.PrevMember,[Цена])
	END)
MEMBER [Отклонение] AS
	(CASE WHEN [Предыдущая цена] <> 0 THEN
		[Цена]/[Предыдущая цена] - 1
	END)
MEMBER [Предыдущая маркировка] AS //?
MEMBER [Маркировка] AS //?
	(CASE WHEN [Отклонение] <= - [Дельта] THEN
		'Да'
	WHEN [Отклонение] < [Дельта]  AND [Предыдущая маркировка] = 'Да' THEN
		'Да'
	END)
SELECT
	{[Measures].[Отгрузки шт],
	[Measures].[Отгрузки сумма без НДС],	
	[Цена],
	[Предыдущая цена],
	[Отклонение],
        [Предыдущая маркировка],
        [Маркировка]}
ON 0,	
	NONEMPTY([Торговые точки].[Код ТТ].[Код ТТ],[Measures].[Отгрузки шт])*
	NONEMPTY([Продукция].[Код продукции].[Код продукции],[Measures].[Отгрузки шт])*	
	[Время].[Дата].[Дата]
ON 1
FROM
	(SELECT
		([Время].[Месяц].&[2018-01-01T00:00:00]:[Время].[Месяц].&[2018-05-01T00:00:00],
		[Торговые точки].[Код ТТ].&[00001ГРД1],
		[Продукция].[Код продукции].&[00001]
		) ON 0
	FROM
		PROFIT)

Результат должен быть таким.
Код ТТКод продукцииДатаОтгрузки штОтгрузки сумма без НДСЦенаПредыдущая ценаОтклонениеПредыдущая маркировкаМаркировка
Код ТТ1Код продукции101.01.20181100100nullnullnullnull
Код ТТ1Код продукции102.01.201811001001000nullnull
Код ТТ1Код продукции103.01.2018nullnullnullnullnullnullnull
Код ТТ1Код продукции104.01.2018216080100-0.2nullДа
Код ТТ1Код продукции105.01.2018324080800ДаДа
Код ТТ1Код продукции106.01.20181100100800.25Даnull
..............................

1. Данные выгружены по дням. Есть поле [Предыдущая цена], который вытягивает цены предыдущей строки, то есть цена предыдущего дня. Период в субкубе указан с первого 1 января 2018. Первая строка берется из 31.12.2017 г. или 01.01.2018?

2. Отгрузки бывают не ежедневные, поэтому предыдущая цена должна игнорировать null. То есть из таблицы: для 4-ой строки предыдущая цена берется из второй строки. Как правильно написать MEMBER?

3. Есть MEMBER [Маркировка]. Улавливает снижение цены больше 9% и маркирует. Если повышение цены до 9 % нету, но в предыдущей строке есть маркировка, то продолжает маркировать. В остальном случае не маркирует. Тут формула смотрит на предыдущую маркировку. Также игнорируются строки null. То есть MEMBER [Маркировка] должна посмотреть на текущий MEMBER [Предыдущая маркировка], а MEMBER [Предыдущая маркировка] берет из предыдущей строки с учетом null MEMBER [Маркировка].Как правильно написать MEMBER? Как правильно написать MEMBER [Предыдущая маркировка]?

Пока игнорируем такие случаи:
- в первой строке снижение цены, то есть акция
- двойное снижение цен (которые больше дельты)
- двойное повышение цен (которые больше дельты) после снижения цен
- само повышение цен
- в какой то один день повышение цен от базовой (не акционной) цены.
3 окт 18, 15:02    [21694179]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по MDX-запросу.  [new]
ferzmikk
Member

Откуда:
Сообщений: 1575
ferzmikk
3. Есть MEMBER [Маркировка]. Улавливает снижение цены больше 9% и маркирует. Если повышение цены до 9 % нету, но в предыдущей строке есть маркировка, то продолжает маркировать. В остальном случае не маркирует. Тут формула смотрит на предыдущую маркировку. Также игнорируются строки null. То есть MEMBER [Маркировка] должна посмотреть на текущий MEMBER [Предыдущая маркировка], а MEMBER [Предыдущая маркировка] берет из предыдущей строки с учетом null MEMBER [Маркировка].Как правильно написать MEMBER? Как правильно написать MEMBER [Предыдущая маркировка]?

Реально ли такую задачу решить в MDX?
4 окт 18, 08:58    [21694799]     Ответить | Цитировать Сообщить модератору
Все форумы / OLAP и DWH Ответить