Ошибка измерения Dax в таблице со 100 строками, но не в таблице с 50 строками

У меня есть следующий файл PowerBI с двумя таблицами.

Формула 100 рядов против 50 рядов

Одна из таблиц содержит 50 строк, а другая — 100 (обе таблицы имеют одинаковые значения, меняется только количество повторяющихся строк).

У меня также есть следующая формула:

Indis = SUMX(
             FILTER( ‘Table50rows’,
                     ‘Table50rows’[cfId] = 10029 ),
             VALUE(‘Table50rows’[fieldValue]) 
             )

Проблема в том, что формула корректно работает с таблицей из 50 строк, но с таблицей из 100 строк выдает следующую ошибку:

MdxScript(Model) (17,5) Ошибка вычисления меры: невозможно преобразовать значение «N0» типа «Текст» в тип «Число».

Это определенно странно. Я не вижу никакой разницы в планах запросов или кодировках столбцов и не знаю, что еще искать.

Alexis Olson 09.07.2024 18:48
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
1
58
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это странно, и мне было бы интересно услышать мысли других. Я также хотел бы обсудить этот вопрос с Microsoft, поскольку ее поведение странное. Кстати, отсечение составляет 65 строк (64 работает нормально, а 65 вызывает проблему). Даже использование слайсера не имеет никакого значения.

Может ли это быть связано с нетерпеливой строгой оценкой в ​​SUMX()? Понятия не имею, и мне были бы интересны другие теории (далее читайте: https://www.sqlbi.com/articles/understanding-eager-vs-strict-evaluation-in-dax/).

Для справки, это заставляет вашу меру работать:

Indis_2 = 
VAR x =     
    FILTER(
        'Table100rows',
        'Table100rows'[cfId] == 10029
    )
VAR y = ADDCOLUMNS(x, "@test", 1)
RETURN

SUMX(
    y,
    VALUE('Table100rows'[fieldValue])
)

Простое принудительное вычисление фильтра путем добавления фиктивного столбца означает, что мера теперь работает.

Самый простой обходной путь, который я нашел, — просто добавить IFERROR(VALUE(‘Table100rows’[fieldValue]), 0) и игнорировать строки, выдающие ошибку в SUM.

PhobosFerro 09.07.2024 15:56

Да, это еще один вариант. Реальный вопрос в том, почему это вообще происходит. Фильтр должен содержать только одну строку и не выдавать никаких ошибок.

davidebacci 09.07.2024 16:04
Ответ принят как подходящий

Я разговаривал с Джеффри Вангом (отцом DAX), и он дал окончательный ответ. Цитируется ниже с его разрешения:

Это связано с разными стратегиями выполнения Vertipaq Engine. это не гарантирует, что VALUE() вызывается после предложенияwhere. Чтобы гарантировать, что VALUE() вызывается только в безопасных случаях, используйте SUMX(..., IF()) шаблон: SUMX('Table100rows', IF('Table100rows'[cfId] = 10029, ЗНАЧЕНИЕ('Таблица100строк'[полеЗначение])))

Это относится ко всем выражениям агрегации, передаваемым в Vertipaq. Двигатель. Выражения агрегирования не должны предполагать, что где пункт применяется первым; вместо этого они должны обеспечить свою собственную безопасность во время исполнения. Я не подразумеваю, что выражения агрегации будут оцениваться во время выполнения, игнорируя предложениеwhere, которое явно проблема с производительностью. Просто выражение может быть оценивается на этапе подготовки Vertipaq Engine относительно некоторых значения без применения предложенияwhere.

Кажется странным, что официальная документация SUMX не упоминает об этом, учитывая, что они используют пример SUMX(FILTER(InternetSales, InternetSales[SalesTerritoryID]=5),[Freight]), который также должен выдавать ошибку.

PhobosFerro 11.07.2024 14:15

Да, но на официальных страницах справки MS есть много недокументированных сведений о DAX. В результате SQLBI обновила DAX.guide.

davidebacci 11.07.2024 14:19

Другие вопросы по теме