Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / Добавить условие / 11 сообщений из 11, страница 1 из 1
27.11.2018, 16:23
    #39739224
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить условие
Здравствуйте!

Есть MDX-запрос, который выгружает количество отгрузок по каждому городу и клиенту.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT
	[Measures].[Количество поставок]
ON 0,
NON EMPTY
	[Города].[Город].[Город]*
	[Торговые точки].[Клиент].[Клиент]
ON 1
FROM
	(SELECT ([Время].[Месяц].&[2018-10-01T00:00:00]) ON 0 FROM PROFIT)


Возможно ли в данном запросе с использованием меры [Measures].[Количество поставок] добавить вычисляемую меру или прописать фильтр так, чтобы возвращал количество отгрузок, где сумма отгрузки меньше 500 р.? Или такую меру надо только в кубе прописывать?
...
Рейтинг: 0 / 0
27.11.2018, 16:26
    #39739229
Andy_OLAP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить условие
ferzmikkЗдравствуйте!

Есть MDX-запрос, который выгружает количество отгрузок по каждому городу и клиенту.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT
	[Measures].[Количество поставок]
ON 0,
NON EMPTY
	[Города].[Город].[Город]*
	[Торговые точки].[Клиент].[Клиент]
ON 1
FROM
	(SELECT ([Время].[Месяц].&[2018-10-01T00:00:00]) ON 0 FROM PROFIT)


Возможно ли в данном запросе с использованием меры [Measures].[Количество поставок] добавить вычисляемую меру или прописать фильтр так, чтобы возвращал количество отгрузок, где сумма отгрузки меньше 500 р.? Или такую меру надо только в кубе прописывать?
Даже не так. Мера в кубе мало поможет. Вам нужно взять Вашу view, на которой Вы считаете distinct count счетчик "Количество поставок" и сделать еще одну view, на которую пойдут строки, где сумма отгрузки меньше 500 рублей. И подключить новую группу мер и новую distinct count меру в ней с названием "Количество дешевых поставок".

Иначе "не взлетит". Впрочем, можете попробовать расчетами. Будет дико тормозить на Ваших объемах, пользователи Вам голову оторвут, потом все-таки сделаете так, как я изначально предлагал.
...
Рейтинг: 0 / 0
28.11.2018, 10:21
    #39739554
StarikNavy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить условие
ferzmikk,

да, Filter функция, по форуму легко гуглится.
если это на постоянно, то лучше как Andy_OLAP рекомендует, с другой стороны на каждый фильтр пользователя группу мер генерить, тоже может быть не очень целеобразно
...
Рейтинг: 0 / 0
29.11.2018, 15:26
    #39740413
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить условие
Если писать MDX-запрос с использованием FILTER
MDX-запрос
Код: 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 [Measures].[Количество отгрузок ТТ. Все]
	AS COUNT(		
		FILTER(
			NONEMPTY(
				{[Торговые точки].[Код ТТ].[Код ТТ]*			
						[Время].[Дата].&[2018-10-01T00:00:00]:[Время].[Дата].&[2018-10-31T00:00:00]*
						[Города].[Город].CurrentMember},
					[Measures].[Отгрузки сумма без НДС]),
				[Measures].[Отгрузки сумма без НДС]>0
			)
		)
		
MEMBER [Measures].[Количество отгрузок ТТ. Менее 100 руб.]
	AS COUNT(		
		FILTER(
			NONEMPTY(
				{[Торговые точки].[Код ТТ].[Код ТТ]*			
						[Время].[Дата].&[2018-10-01T00:00:00]:[Время].[Дата].&[2018-10-31T00:00:00]*
						[Города].[Город].CurrentMember},
					[Measures].[Отгрузки сумма без НДС]),
				[Measures].[Отгрузки сумма без НДС]>0 AND [Measures].[Отгрузки сумма без НДС] < 100
			)
		)
SELECT
	{[Measures].[Количество отгрузок ТТ. Все],
	[Measures].[Количество отгрузок ТТ. Менее 100 руб.]}
ON 0,
NON EMPTY
	[Города].[Город].[Город]
ON 1
FROM
	(SELECT ([Время].[Месяц].&[2018-10-01T00:00:00]) ON 0 FROM PROFIT)

то по времени выгружает 6 мин 42 сек при выводе 40 строк. Запрос возможно не совсем оптимизированный. Помимо того, что в субкубе указан Октябрь 2018 как месяц, то в MEMBER указываем период как день.

1. Возможно ли еще как то оптимизировать запрос, чтобы быстрее выполнялся?

2. Возможно ли как то обойти, чтобы в запросе выделенные записи не указывать? Но без них очень долго будет выгружаться.
...
Рейтинг: 0 / 0
07.12.2018, 11:37
    #39744111
mishgan1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить условие
ferzmikk,

Начал бы с замены FILTER на SUM для начала ))


WITH
MEMBER [Measures].[Количество отгрузок ТТ. Все]
AS SUM(NONEMPTY(
{[Торговые точки].[Код ТТ].[Код ТТ]*[Города].[Город].CurrentMember},
[Measures].[Отгрузки сумма без НДС]),
iif([Measures].[Отгрузки сумма без НДС]>0,1,null)
)

MEMBER [Measures].[Количество отгрузок ТТ. Менее 100 руб.]
AS SUM(NONEMPTY(
{[Торговые точки].[Код ТТ].[Код ТТ]*[Города].[Город].CurrentMember},
[Measures].[Отгрузки сумма без НДС]),
iif([Measures].[Отгрузки сумма без НДС]>0 AND [Measures].[Отгрузки сумма без НДС] < 100,1,null)
)

SELECT
{[Measures].[Количество отгрузок ТТ. Все],
[Measures].[Количество отгрузок ТТ. Менее 100 руб.]}
ON 0,
NON EMPTY
[Города].[Город].[Город]
ON 1
FROM PROFIT
Where ([Время].[Месяц].&[2018-10-01T00:00:00])
...
Рейтинг: 0 / 0
07.12.2018, 12:04
    #39744147
mishgan1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить условие
mishgan1,

2.Еще убрал бы *[Города].[Город].CurrentMember из перемножения, в Select on 1 они есть уже и мера должна отработать в их контексте
3. Ну если нужно посчитать с гранулярностью до дня добавил бы *EXISTING [Время].[День].[День]

WITH
MEMBER [Measures].[Количество отгрузок ТТ. Все]
AS SUM(NONEMPTY(
{[Торговые точки].[Код ТТ].[Код ТТ]*EXISTING [Время].[День].[День]},
[Measures].[Отгрузки сумма без НДС]),
iif([Measures].[Отгрузки сумма без НДС]>0,1,null)
)

MEMBER [Measures].[Количество отгрузок ТТ. Менее 100 руб.]
AS SUM(NONEMPTY(
{[Торговые точки].[Код ТТ].[Код ТТ]*EXISTING [Время].[День].[День]},
[Measures].[Отгрузки сумма без НДС]),
iif([Measures].[Отгрузки сумма без НДС]>0 AND [Measures].[Отгрузки сумма без НДС] < 100,1,null)
)

SELECT
{[Measures].[Количество отгрузок ТТ. Все],
[Measures].[Количество отгрузок ТТ. Менее 100 руб.]}
ON 0,
NON EMPTY
[Города].[Город].[Город]
ON 1
FROM PROFIT
Where ([Время].[Месяц].&[2018-10-01T00:00:00])

Ну как то так наверно ))
...
Рейтинг: 0 / 0
07.12.2018, 13:37
    #39744260
Гулин Федор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить условие
ferzmikk,

___MDX.with.Microsoft.SQL.Server.2008.R2.Analysis.Services.Cookbook.Aug.2011.pdf

Отличная книжка с рецептами -
По кр. мере лучше что я нашел
я сам далеко НЕ эксперт в мдх
но находил почти все что мне надо было с пол-года назад
что не находил спрашивал здесь :)

зы навреняка есть на ру..кере или в инете
если вдруг нет - пиши-кину
...
Рейтинг: 0 / 0
07.12.2018, 15:06
    #39744328
StarikNavy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить условие
Гулин Федор,

кстати да. хорошая книга. и там (тоже кстати) рекомендуют не пользоваться Filter ))


Filter function is an iterative function which doesn't run in block mode, hence it will slow
down the query. In the introduction, we said that it's always wise to search for an alternative if
available. Let's see if something can be done here. A keen eye will notice a "count of filtered
items" pattern in this expression. That pattern suggests the use of a set-based approach in
the form of SUM-IF combination. The trick is to provide 1 for the True part of the condition
taken from the FILTER() statement and null for the False part. The sum of one will be
equivalent to the count of filtered items.

In other words, once rewritten, that same calculated member would look like this:
MEMBER [Measures].[Positive growth days] AS
SUM(
Descendants([Date].[Fiscal].CurrentMember, , leaves),
IIF( [Measures].[Growth in Customer Base] > 0, 1, null)
)
...
Рейтинг: 0 / 0
07.12.2018, 16:56
    #39744459
Alex_496
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить условие
1) Вариант с Distinct Count
Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE MEMBER CURRENTCUBE.[Measures].[Торговых точек активных количество] -- продающих торговых точек
AS
[Measures].[id_sale_point_active]
,FORMAT_STRING = "#,#"
,ASSOCIATED_MEASURE_GROUP = 'Показатели'
,DISPLAY_FOLDER = 'Торговые точки'
,VISIBLE = 1;




Варианты вычисляемых показателей
2) COUNT(FILTER(...))
и
3) SUM(...)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
/*
CREATE MEMBER CURRENTCUBE.[Measures].[Торговых точек активных количество] -- продающих торговых точек
AS
--COUNT(FILTER(NONEMPTY( [Торговые точки].[Код торговой точки].[Код торговой точки], [Measures].[is_credit_contract]) , [Measures].[is_credit_contract] > 0))
-- так будет быстрее рассчитываться:
SUM( [Торговые точки].[Код торговой точки].[Код торговой точки],  IIF([Measures].[is_credit_contract] > 0, 1, NULL)  )
,FORMAT_STRING = "#,#"
,ASSOCIATED_MEASURE_GROUP = 'Показатели'
,DISPLAY_FOLDER = 'Торговые точки'
,VISIBLE = 1;
*/




В моем случае конфигурации мощного сервера показывало 1) и 3) ~ одинаковы по скорости,
но много показателей 1) не наделаешься
...
Рейтинг: 0 / 0
07.12.2018, 17:03
    #39744461
Andy_OLAP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить условие
Alex_496SUM( [Торговые точки].[Код торговой точки].[Код торговой точки], IIF([Measures].[is_credit_contract] > 0, 1, NULL) )

SUM без existing и dynamic set - а потом автор темы будет в очередной раз спрашивать здесь же, почему у него иерархия по измерению "Торговые точки" выдает на промежуточных уровнях непонятные результаты...
...
Рейтинг: 0 / 0
07.12.2018, 17:06
    #39744467
Andy_OLAP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить условие
Alex_496,

"Подключить новую группу мер и новую distinct count меру в ней с названием "Количество дешевых поставок".
Иначе "не взлетит". Впрочем, можете попробовать расчетами" - таки Вы увидите, что автор темы через полгода именно так и сделает. Потом будет в PowerBI прикручивать на все уже существующие отчеты. Он вообще по-моему не слушает, что ему говорят, а делает некий макет, который работает в его воображении, а потом пытается напильником самолет превратить в ракету. Интересный способ разработки, я за ним с большим любопытством наблюдаю, но мне непонятно терпение его пользователей.
...
Рейтинг: 0 / 0
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / Добавить условие / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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