powered by simpleCommunicator - 2.0.43     © 2025 Programmizd 02
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / NONEMPTY (IIF) Строки не отбрасываются условием
18 сообщений из 18, страница 1 из 1
NONEMPTY (IIF) Строки не отбрасываются условием
    #40105536
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 - "ровные нули"
...
Рейтинг: 0 / 0
NONEMPTY (IIF) Строки не отбрасываются условием
    #40105624
grAlex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
NONEMPTY (IIF) Строки не отбрасываются условием
    #40105773
ShIgor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grAlex,

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


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



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

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

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


ShIgor,

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

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

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

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

Optimizing Count(Filter(...)) expressions in MDX
?
...
Рейтинг: 0 / 0
NONEMPTY (IIF) Строки не отбрасываются условием
    #40105880
ShIgor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
NONEMPTY (IIF) Строки не отбрасываются условием
    #40109845
montoya.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ShIgor
grAlex,

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


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

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

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

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

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


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

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


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

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

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

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

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

заранее спасибо.
...
Рейтинг: 0 / 0
NONEMPTY (IIF) Строки не отбрасываются условием
    #40109899
montoya.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот такое ещё решение предлагают...
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
NONEMPTY (IIF) Строки не отбрасываются условием
    #40109945
ShIgor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
montoya.,

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

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

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

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


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


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