powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / Логика расчета
7 сообщений из 32, страница 2 из 2
Логика расчета
    #39424125
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такой вопрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
WITH
MEMBER [Вычисляемая мера] AS ([Время].[Месяц].&[2017-02-01T00:00:00], [Measures].[Мера2])
SELECT
    {([Время].[Месяц].&[2016-02-01T00:00:00], [Measures].[Мера1]),
    ([Время].[Месяц].&[2017-02-01T00:00:00], [Measures].[Мера1]),
    ([Время].[Месяц].&[2016-02-01T00:00:00],[Вычисляемая мера]),
    ([Время].[Месяц].&[2017-02-01T00:00:00],[Вычисляемая мера])
} on 0,
    [Города].[Город].[Город]
ON 1
FROM
    profit


В результате получаем, что для третьей и четвертой колонки значения одинаковые. Я правильно понимаю, что для этих мер указанная дата внутри в скобках после SELECT никак не влияет на результат?


И еще.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
WITH
SET [Сет1] AS [Время].[Месяц].&[2016-02-01T00:00:00]
SET [Сет2] AS [Время].[Месяц].&[2017-02-01T00:00:00]
MEMBER [Время].[Месяц].[Сет1 как мера] AS [Сет1].Item(0)
MEMBER [Время].[Месяц].[Сет2 как мера] AS [Сет2].Item(0)
MEMBER [Вычисляемая мера1] AS ([Сет1 как мера], [Measures].[Мера2])
MEMBER [Вычисляемая мера2] AS ([Сет2 как мера], [Measures].[Мера2])
SELECT
	{([Время].[Месяц].&[2016-02-01T00:00:00], [Measures].[Мера1]),
	([Время].[Месяц].&[2017-02-01T00:00:00], [Measures].[Мера1]),
	([любой сет],[Вычисляемая мера1]),
	([любой сет],[Вычисляемая мера2])} ON 0,
	[Города].[Город].[Город] ON 1
FROM
   Profit


чтобы вместо выделенных строк было так
Код: sql
1.
2.
	([Сет1],[Вычисляемая мера]),
	([Сет2],[Вычисляемая мера])



Это нужно для того, чтобы в результате были нужные названия заголовок (первая строка заголовка месяцы, а вторая строка заголовков - меры). Это возможно сделать?
...
Рейтинг: 0 / 0
Логика расчета
    #39426562
ShIgor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

1. См картинку. На пальцах понятнее?
2. Как это Вы хотите запихнуть набор в кортеж? Вам нужен конкретный член, а это [Сет1].Item(0)
...
Рейтинг: 0 / 0
Логика расчета
    #39431237
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShIgorferzmikk,

1. См картинку. На пальцах понятнее?
На картинке понятно. Спасибо!

Но тут поэкспериментировал с данными и потом кое что обнаружил интересное.

Вот такой MDX-запрос. Возьмем для анализа Мера1 и вычисляемую меру Фильтр Предыдущий месяц Мера1. Эта вычисляемая мера рассчитывает сумму Мера1 по всем SKU для соответствующей ТТ. С учетом того, что в результате данные выводим по ТТ, а не по ТТ и SKU.
Код: 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.
WITH
SET [Анализируемый месяц] AS [Время].[Месяц].&[2017-03-01T00:00:00]
MEMBER [Время].[Месяц].[Базовый месяц] AS [Анализируемый месяц].Item(0)
MEMBER [Время].[Месяц].[Предыдущий месяц] AS [Анализируемый месяц].Item(0).Lag(1)	

MEMBER [Вычисляемая мера Предыдущий месяц Мера] AS
	([Предыдущий месяц],[Measures].[Мера])	
		
MEMBER [Фильтр Предыдущий месяц Мера1] AS
	SUM(
		Filter(
			[SKU].[SKU].[SKU],
			([Торговые точки].[Код ТТ].CurrentMember, [Measures].[Мера1])<>0),
		([Предыдущий месяц], [Measures].[Мера1]))
		
SELECT	
{   
	([Предыдущий месяц],       [Measures].[Мера1]),
	([Базовый месяц],          [Measures].[Мера1]),
	([Предыдущий месяц],       [Вычисляемая мера Предыдущий месяц Реализация сумма без НДС]),
	([Базовый месяц],          [Вычисляемая мера Предыдущий месяц Реализация сумма без НДС]),
	([Предыдущий месяц],       [Фильтр Предыдущий месяц Мера1]),
	([Базовый месяц],          [Фильтр Предыдущий месяц Мера1])
}   ON 1,
NON EMPTY
	[Торговые точки].[Код ТТ].[Код ТТ]
	ON 0
FROM 
	(SELECT (
		[Время].[Месяц].&[2017-02-01T00:00:00]:[Время].[Месяц].&[2017-03-01T00:00:00],		
		[Торговые точки].[Код ТТ].[ТТ00001])
		On 0 FROM PROFIT) 


Получаем такой результат
ТТ00001Предыдущий месяцМера1223Базовый месяцМера1236Предыдущий месяцВычисляемая мера Предыдущий месяц Мера1223Базовый месяцВычисляемая мера Предыдущий месяц Мера1223Предыдущий месяцФильтр Предыдущий месяц Мера1223Базовый месяцФильтр Предыдущий месяц Мера1 217
Как видим в третьей и в четвертой строке значение 223, что так и должно быть. Но по последней строке другое значение. По сути якобы значение должно быть 223. Или тут другая логика срабатывает, например, фильтр как то влияет?
...
Рейтинг: 0 / 0
Логика расчета
    #39436961
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как правильно написать, чтобы вместо значения 217 возвращал 223?
...
Рейтинг: 0 / 0
Логика расчета
    #39437585
ShIgor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

Сейчас в фильтре участвует [Время].[Месяц].CurrentMember, и получается, что результирующий набор SKU разный, ну и результаты тоже разные. См вложение - там все понятно.
Чтобы вернуть 223, то и в фильтре надо указывать [Время].[Месяц].[Предыдущий месяц]

Запрос для "велозавода" демонстрирует то же самое:

MDX для Adventure Works
Код: 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.
WITH
SET [Анализируемый месяц] AS [Date].[Calendar Year].&[2006]
MEMBER [Date].[Calendar Year].[Базовый месяц] AS [Анализируемый месяц].Item(0)
MEMBER [Date].[Calendar Year].[Предыдущий месяц] AS [Анализируемый месяц].Item(0).Lag(1)	

MEMBER [Вычисляемая мера Предыдущий месяц Мера1] AS
	([Предыдущий месяц],[Measures].[Internet Sales Amount])	
		
MEMBER [Фильтр Предыдущий месяц Мера1] AS
	SUM(
		Filter(
			[Product].[Product].[Product],
			([Sales Territory].[Sales Territory Country].CurrentMember, [Measures].[Internet Sales Amount])<>0),
			([Предыдущий месяц], [Measures].[Internet Sales Amount]))
		
SELECT	
{   
   	{[Measures].[Internet Sales Amount], [Вычисляемая мера Предыдущий месяц Мера1], [Фильтр Предыдущий месяц Мера1]} *
	{[Предыдущий месяц], [Базовый месяц]}
}   ON 1,
NON EMPTY
	[Sales Territory].[Sales Territory Country].[Sales Territory Country]
	ON 0
FROM 
	(SELECT (
		[Date].[Calendar Year].&[2005]:[Date].[Calendar Year].&[2006],		
		[Sales Territory].[Sales Territory Country].&[Australia])
		On 0 FROM [Adventure Works]) 

...
Рейтинг: 0 / 0
Логика расчета
    #39438453
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShIgorferzmikk,

Сейчас в фильтре участвует [Время].[Месяц].CurrentMember, и получается, что результирующий набор SKU разный, ну и результаты тоже разные. См вложение - там все понятно.
Чтобы вернуть 223, то и в фильтре надо указывать [Время].[Месяц].[Предыдущий месяц]
Получилось! Спасибо! Надо было написать так
Код: sql
1.
2.
3.
4.
5.
6.
MEMBER [Фильтр Предыдущий месяц Мера1] AS
	SUM(
		Filter(
			[SKU].[SKU].[SKU],
			([Торговые точки].[Код ТТ].CurrentMember, [Предыдущий месяц], [Measures].[Мера1])<>0),
		([Предыдущий месяц], [Measures].[Мера1]))
...
Рейтинг: 0 / 0
Логика расчета
    #39440513
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, написал MDX-запрос для Adventure Works , который похож на реальный и упрощенный для быстрого понимания.

Задача такая. Выгружается поле [Internet Sales Amount] так, чтобы было скорректировано. Пример во вложенном файле. Там прописаны формулы и должно так считаться, предполагая что сейчас Апрель 2008. Логика такая что именно только для двух субкатегории ("Bike Stands" и "Bottles and Cages" ) для текущего (Апрель 2008) и предыдущего месяца (Март 2008) идет расчет от фактических данных, а ранее предыдущего месяца (Февраль 2008 и ранее) выгружаются фактические данные. Остальные субкатегории выгружаются по фактическим данным вне зависимо какой анализируемый месяц и какой сейчас месяц.

Запрос написал, запрос работает. Но получился очень сложный. Я думаю его можно написать попроще, учитывая что есть другие меры, которые надо также скорректировать. А также если написать в формуле проверку, чтобы знаменатель был не нулевым, то запрос удлиняется значительно.
Код: 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.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
WITH
//Пусть сейчас апрель 2008 года, не важно какое число
MEMBER [Measures].[Текущий месяц] AS VBA!Format(VBA!Dateadd('m', 0, VBA!Dateserial(2008,04,01)), '01.MM.yyyy')
//Следовательно, предыдущий месяц это март 2008
MEMBER [Measures].[Предыдущий месяц] AS VBA!Format(VBA!DateAdd('m', -1, [Текущий месяц]), '01.MM.yyyy')

//В один сет толкаем один элемент Субкатегории
SET [Bike Stands] AS [Product].[Subcategory].&[27]
//В другой сет толкаем другой элемент Субкатегории
SET [Bottles and Cages] AS [Product].[Subcategory].&[28]

//Месяц и год для каждой строки
//Возможно эту меру написать попроще имея в Adventure Works специальные меры и атрибуты
MEMBER [Measures].[Соответствующий месяц] AS		
	VBA!Format(
		DATESERIAL(
			[Date].[Calendar Year].CURRENTMEMBER.MemberValue,
			[Date].[Month of Year].CURRENTMEMBER.MemberValue,
			1
		),
		 '01.MM.yyyy'
	)
	
//Скорректированная мера в зависимости от того какой анализируемый период берется и какой сейчас месяц
//Самое главное упростить надо тут
MEMBER [Measures].[Скоррект Internet Sales Amount] AS	
	(CASE WHEN ([Product].[Subcategory].CurrentMember IS [Bike Stands].Item(0)) OR 
		([Product].[Subcategory].CurrentMember IS [Bottles and Cages].Item(0)) THEN
		//Если месяц в строке это текущий месяц
		(CASE WHEN [Measures].[Соответствующий месяц] = [Текущий месяц] THEN
			([Date].[Calendar].CurrentMember.Lag(2),[Internet Sales Amount])
			/
			SUM(FILTER ({[Bike Stands],[Bottles and Cages]},
				([Customer].[City].CurrentMember,
					[Date].[Calendar].CurrentMember.Lag(2),
					[Measures].[Internet Sales Amount])>0),
			([Date].[Calendar].CurrentMember.Lag(2),[Internet Sales Amount]))
			*
			SUM(FILTER ({[Bike Stands],[Bottles and Cages]},
				([Customer].[City].CurrentMember,
					[Date].[Calendar].CurrentMember,
					[Measures].[Internet Sales Amount])>0),
			([Date].[Calendar].CurrentMember,[Internet Sales Amount])) 
		//Если месяц в строке это предыдущий от текущего месяца
		WHEN [Measures].[Соответствующий месяц] =[Предыдущий месяц] THEN
			([Date].[Calendar].CurrentMember.Lag(1),[Internet Sales Amount])
			/
			SUM(FILTER ({[Bike Stands],[Bottles and Cages]},
				([Customer].[City].CurrentMember,
					[Date].[Calendar].CurrentMember.Lag(1),
					[Measures].[Internet Sales Amount])>0),
			([Date].[Calendar].CurrentMember.Lag(1),[Internet Sales Amount]))
			*
			SUM(FILTER ({[Bike Stands],[Bottles and Cages]},
				([Customer].[City].CurrentMember,
					[Date].[Calendar].CurrentMember,
					[Measures].[Internet Sales Amount])>0),
			([Date].[Calendar].CurrentMember,[Internet Sales Amount]))
		//Если месяц в строке ранее предыдущего от текущего месяца
		WHEN [Measures].[Соответствующий месяц] <[Предыдущий месяц] THEN
			([Date].[Calendar].CurrentMember,[Internet Sales Amount]) 
		//Остальные месяцы (будущие)
		ELSE 
			NULL
		END)
        //Остальные субкатегории
        ELSE
              ([Date].[Calendar].CurrentMember,[Internet Sales Amount])
	END)
	
SELECT
	{[Measures].[Internet Sales Amount],
	[Measures].[Скоррект Internet Sales Amount]	}
ON 0,
	[Customer].[City].[City]*
	[Product].[Subcategory].[Subcategory]*
	[Date].[Calendar].[Month]*
	[Date].[Calendar Year].[Calendar Year]*
	[Date].[Month of Year].[Month of Year]
ON 1
FROM
	(SELECT ([Date].[Calendar].[Month].&[2008]&[1]:[Date].[Calendar].[Month].&[2008]&[11],
		[Customer].[City].&[Coffs Harbour]&[NSW],			
		{[Product].[Subcategory].&[27],	[Product].[Subcategory].&[28]}
		)	ON 0 FROM [Adventure Works])


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


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