Гость
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / NONEMPTY (IIF) Строки не отбрасываются условием / 18 сообщений из 18, страница 1 из 1
20.10.2021, 11:24
    #40105536
grAlex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NONEMPTY (IIF) Строки не отбрасываются условием
Привет всем.
Подскажите как такое может быть...
Запрос:
Код: sql
1.
2.
3.
4.
SELECT 
  {[Measures].[Реализация без НДС]} on 0,
  NONEMPTY( [Название клиента].[Код клиента].[Код клиента], IIF([Measures].[Реализация без НДС] = 0, NULL, [Measures].[Реализация без НДС]) ) on 1
FROM [КУБ]



Возвращает строки которых не должно быть, типа:
Код клиента Реализация без НДС.........2223203717876.32223203811004.182223203928640.482223390002227060102227060202223202729017.642223202810949.42.........

Там действительно "0". Тип данных Currency - "ровные нули"
...
Рейтинг: 0 / 0
20.10.2021, 15:35
    #40105624
grAlex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NONEMPTY (IIF) Строки не отбрасываются условием
grAlex
Привет всем.
Подскажите как такое может быть...
Запрос:
Код: sql
1.
2.
3.
4.
SELECT 
  {[Measures].[Реализация без НДС]} on 0,
  NONEMPTY( [Название клиента].[Код клиента].[Код клиента], IIF([Measures].[Реализация без НДС] = 0, NULL, [Measures].[Реализация без НДС]) ) on 1
FROM [КУБ]



Возвращает строки которых не должно быть, типа:
Код клиента Реализация без НДС.........2223203717876.32223203811004.182223203928640.482223390002227060102227060202223202729017.642223202810949.42.........


Там действительно "0". Тип данных Currency - "ровные нули"

Вопрос связан с механизмом получения "DistinctCount" количества
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE HIDDEN DYNAMIC SET CURRENTCUBE.[КлиентыР]
 AS EXISTING [Название клиента].[Код клиента].[Код клиента];    
и далее [Количество клиентов_]:
COUNT(NONEMPTY(EXISTING [КлиентыР], IIF([Measures].[Реализация без НДС]=0,NULL,[Measures].[Реализация без НДС])))
или так 
COUNT(NONEMPTY(EXISTING [КлиентыР], IIF([Measures].[Реализация без НДС]>0,[Measures].[Реализация без НДС],NULL)))
....
 iif([Measures].[Количество клиентов_] = 0, null, [Measures].[Количество клиентов_]),



Такой подход включает в подсчет тех самых"нолевых клиентов"..

Если использовать [Количество клиентов_]:
Код: sql
1.
SUM ([КлиентыР], IIF([Measures].[Реализация без НДС] > 0, 1, NULL))



То расчет идет верно. "нолевых клиентов" нет. Проверено T-SQL на DWH

Почему происходит расхождение?
...
Рейтинг: 0 / 0
21.10.2021, 11:32
    #40105773
ShIgor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NONEMPTY (IIF) Строки не отбрасываются условием
grAlex,

скорее всего тип данных у меры Double, а не Currency/
а т.к. Double это не точный тип данных, то там вместо 0 может быть что-то близкое к нему.
поэтому сравнение на 0 не проходит..
попробуйте в формуле округлить
лучше поменять тип в кубе.
...
Рейтинг: 0 / 0
21.10.2021, 12:45
    #40105796
grAlex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NONEMPTY (IIF) Строки не отбрасываются условием
ShIgor,

Спасибо за участие.
В том то и дело, что поля Currency и они точно 0 (NULL, см. ниже).

Тут такая особенность:
Куб состоит из двух секций в одной, в разрезе клиента, однозначна есть реализация, она всегда заполнена.
Другая секция (будем считать ее "План"), вообще не содержит данные о реализации - поле [Реализация без НДС] - гарантировано NULL (тип numeric(18,4)) во всех строках.

При запросе
Код: sql
1.
2.
3.
4.
SELECT 
  {[Measures].[Реализация без НДС]} on 0,
  NONEMPTY( [Название клиента].[Код клиента].[Код клиента], IIF([Measures].[Реализация без НДС] = 0, NULL, [Measures].[Реализация без НДС]) ) on 1
FROM [КУБ]



"нолевые клиенты" - это те клиенты которые есть в "плане", и нет в реализации. Они все выпадают в этом запросе. Как будто реализация равная NULL считается как значимая. (NullProcessing = Automatic)

Что и удивляет
Код: sql
1.
SUM ([КлиентыР], IIF([Measures].[Реализация без НДС] > 0, 1, NULL))

на этих же условиях отрабатывает корректно.

Куда смотреть?
...
Рейтинг: 0 / 0
21.10.2021, 13:02
    #40105803
grAlex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NONEMPTY (IIF) Строки не отбрасываются условием
grAlex


Тут такая особенность:
Куб состоит из двух секций в одной, в разрезе клиента, однозначна есть реализация, она всегда заполнена.
Другая секция (будем считать ее "План"), вообще не содержит данные о реализации - поле [Реализация без НДС] - гарантировано NULL (тип numeric(18,4)) во всех строках.



Объединение в одну секцию через View - тот же результат
...
Рейтинг: 0 / 0
21.10.2021, 13:47
    #40105814
ShIgor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NONEMPTY (IIF) Строки не отбрасываются условием
grAlex,

может не разбираться что у Вас там со связями и настройками, а сделать проще?
уйти от Count(Filter.. и не думать об этом. рассказать как или знаете?
...
Рейтинг: 0 / 0
21.10.2021, 14:02
    #40105820
grAlex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NONEMPTY (IIF) Строки не отбрасываются условием
ShIgor
grAlex,

может не разбираться что у Вас там со связями и настройками, а сделать проще?
уйти от Count(Filter.. и не думать об этом. рассказать как или знаете?


ShIgor,

Имеется ввиду
MDX: block evaluation + суррогатный атрибут ?

Но в любом случае лучше рассказать
Заранее благодарю

PS или Вы имеете ввиду физическую DC меру?
...
Рейтинг: 0 / 0
21.10.2021, 14:42
    #40105840
grAlex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NONEMPTY (IIF) Строки не отбрасываются условием
grAlex,

Или это имеется ввиду

Optimizing Count(Filter(...)) expressions in MDX
?
...
Рейтинг: 0 / 0
21.10.2021, 15:46
    #40105880
ShIgor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NONEMPTY (IIF) Строки не отбрасываются условием
grAlex,

и да, и да...
но сам использую слегка видоизмененное решение

в группе мер от которой зависит подсчет создаю меру на поле у которого для всех записей значение null с необходимым типом агрегации. в данном случае SUM, чем добиваюсь корректной работы функции Aggregate и иерархий в измерении на котором будем делать подсчет.

в скрипте куба определяю скоп для этой меры и измерения.

Код: sql
1.
2.
3.
4.
scope (Measures.[меранаосновеnull], [измерениедляподсчетаDC].[иерархия].[уровень].Members);
  This = 1;
  non_empty_behavior(This) = [Measures].[мерасреальнымиданнымитойжегруппымер];
end scope;



дальше все встает автоматом и работает на отличных скоростях.
для примера, вычисления по 100млн измерению абсолютно не уступают в производительности мере с типом агрегации DC.
даже накопительный итог по такой мере вполне жизнеспособен.
поэтому избавляюсь от DC везде, где могу.
...
Рейтинг: 0 / 0
07.11.2021, 19:54
    #40109845
montoya.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NONEMPTY (IIF) Строки не отбрасываются условием
ShIgor
grAlex,

и да, и да...
но сам использую слегка видоизмененное решение


приветствую
производительность удивила... реально классная.

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

что бы считать только по положительным значениям ?
...
Рейтинг: 0 / 0
07.11.2021, 20:09
    #40109852
grAlex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NONEMPTY (IIF) Строки не отбрасываются условием
montoya,

This = IIF([Measures].[Реализация без НДС] > 0, 1, NULL);
...
Рейтинг: 0 / 0
07.11.2021, 20:19
    #40109855
montoya.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NONEMPTY (IIF) Строки не отбрасываются условием
grAlex
montoya,

This = IIF([Measures].[Реализация без НДС] > 0, 1, NULL);


класс!
спасибо.
теперь прийдётся всё переписывать))) благо не много
...
Рейтинг: 0 / 0
07.11.2021, 22:07
    #40109883
montoya.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NONEMPTY (IIF) Строки не отбрасываются условием
grAlex
montoya,

This = IIF([Measures].[Реализация без НДС] > 0, 1, NULL);


переписал, всё просто супер.
кроме одной меры....

есть у меня мера в отдельной группе мер "Distinc Child товаров".
справочник 500 000 товаров.
по этой мере соответственно агрегации настроены.
и работает за счёт агрегаций шустро.

но.... это мера занимает пол куба по размеру... как-то слишком много.

а вычисляемая по вышеописанному принципу считается очень долго...

не подскажите в этой дилеме как лучше поступить.?

заранее спасибо.
...
Рейтинг: 0 / 0
07.11.2021, 23:37
    #40109899
montoya.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NONEMPTY (IIF) Строки не отбрасываются условием
вот такое ещё решение предлагают...
1. The Tabular Model.
2. An alternative to the distinct count using an extra dimension
3. The Microsoft Recommendations for distinct count measure

попробую первые 2 пункта...интересно.

https://www.mssqltips.com/sqlservertip/3043/different-options-for-creating-a-distinct-count-measure-in-ssas/
...
Рейтинг: 0 / 0
08.11.2021, 10:34
    #40109945
ShIgor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NONEMPTY (IIF) Строки не отбрасываются условием
montoya.,

медленно это как?
поэкспериментируйте с IIF, если проверяемое пространство куба разреженное, то NULL лучше расположить в части true и наоборот.

я бы вообще рекомендовал отказаться от IIF
если мера [Реализация без НДС] физическая, значит ее результат известен до заливки данных в куб.
соответственно это условие можно сделать измерением [суммаНДC>0] да/нет.
и просто использовать подпространство "да" в scope.
...
Рейтинг: 0 / 0
08.11.2021, 12:53
    #40109975
montoya.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NONEMPTY (IIF) Строки не отбрасываются условием
ShIgor
montoya.,

медленно это как?
поэкспериментируйте с IIF, если проверяемое пространство куба разреженное, то NULL лучше расположить в части true и наоборот.

я бы вообще рекомендовал отказаться от IIF
если мера [Реализация без НДС] физическая, значит ее результат известен до заливки данных в куб.
соответственно это условие можно сделать измерением [суммаНДC>0] да/нет.
и просто использовать подпространство "да" в scope.


медленно - это я не дождался выполнения запроса. ждал минут 10 точно.
ок, спасибо попробую!

distinct count считаю для остатков товара.
которые рассчитываются по формуле.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
([Время].[День].[День], Measures.[NULL Quantity Total]) = SUM(YTD(), Measures.[bal_Quantity Total]);
([Время].[День].[День], Measures.[NULL Quantity Total]) = iif(Measures.[NULL Quantity Total] = 0, null, Measures.[NULL Quantity Total]);

([LastFactDay].Item(0).Lead(1) : NULL, [NULL Quantity Total]) = [LastFactDay].Item(0); 

CREATE MEMBER CURRENTCUBE.[Measures].[Ост всего шт] AS [Measures].[NULL Quantity Total]
,FORMAT_STRING = "#,##0;-#,##0"
,VISIBLE = 1, DISPLAY_FOLDER = '', ASSOCIATED_MEASURE_GROUP = 'Остатки';      

    ([LastFactDay].Item(0).Lead(1)              : NULL, [Ост всего шт]) = NULL;
    ([CurrentWeekCalendar].Item(0).Lead(1)      : NULL, [Ост всего шт]) = NULL;    
    ([CurrentMonthCalendar].Item(0).Lead(1)     : NULL, [Ост всего шт]) = NULL;
    ([CurrentQuarterCalendar].Item(0).Lead(1)   : NULL, [Ост всего шт]) = NULL;
    ([CurrentSemestrCalendar].Item(0).Lead(1)   : NULL, [Ост всего шт]) = NULL;
    ([CurrentYearCalendar].Item(0).Lead(1)      : NULL, [Ост всего шт]) = NULL;

    (CurrentWeekFiscal.Item(0).Lead(1)          : NULL, [Ост всего шт]) = NULL;
    (CurrentMonthFiscal.Item(0).Lead(1)         : NULL, [Ост всего шт]) = NULL;
    (CurrentQuarterFiscal.Item(0).Lead(1)       : NULL, [Ост всего шт]) = NULL;
    (CurrentYearFiscal.Item(0).Lead(1)          : NULL, [Ост всего шт]) = NULL;	
...
Рейтинг: 0 / 0
08.11.2021, 13:03
    #40109980
montoya.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NONEMPTY (IIF) Строки не отбрасываются условием
ну и кусок кода для DC

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
SCOPE ([Measures].[NULL DC Products], [Товары].[Наименование].[Наименование].Members);
  THIS = IIF([Measures].[Ост всего шт] > 0, 1, NULL);
  NON_EMPTY_BEHAVIOR(THIS) = [Measures].[Ост всего шт] ;
END SCOPE;

CREATE MEMBER CURRENTCUBE.[Measures].[qP] 
AS [Measures].[NULL DC Products],
FORMAT_STRING = "#,##0;-#,##0",
VISIBLE = 1 ,  ASSOCIATED_MEASURE_GROUP = 'Остатки';
...
Рейтинг: 0 / 0
16.11.2021, 11:04
    #40112260
montoya.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NONEMPTY (IIF) Строки не отбрасываются условием
ShIgor
montoya.,

медленно это как?
поэкспериментируйте с IIF, если проверяемое пространство куба разреженное, то NULL лучше расположить в части true и наоборот.

я бы вообще рекомендовал отказаться от IIF
если мера [Реализация без НДС] физическая, значит ее результат известен до заливки данных в куб.
соответственно это условие можно сделать измерением [суммаНДC>0] да/нет.
и просто использовать подпространство "да" в scope.


перевёл остатки с YearToDate на MonthToDate
что странно - производительность мер остатков немного упала(на глаз не видно, только по студии)
НО производительность DISTINCT Count - взлетела!
...
Рейтинг: 0 / 0
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / NONEMPTY (IIF) Строки не отбрасываются условием / 18 сообщений из 18, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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