Страницы: 1
RSS
Power Query. Формулы на языке М, Потребность в "простых" математические действиях на языке М
 
Привет всем. Query очень удобная штука, помогает мне решать задачи. И часто очень хочется сэкономить дальнейшую обработку внеся 1-2 колонки с в принципе как бы не сложным математическим действием.
Но язык М это нечто, быстро и просто (освоить) это не о нём. Моя просьба, прошу знатока написать формулы, по структуре как указанные примеры в файле во вложении, там такая себе таблица с колонкой в которой приведено какие нужны формулы на языке М (скобки для того что бы прога не принимала = как начало формулы), и они должны учитывать что любой аргумент, его значение, может быть отрицательным, может быть Ноль, или null.
Если действие математически не корректно формула должна выдать Ноль. Надеюсь сама просьба корректна, не слишком наглая, сам я не привык грузить других, но тут застрял. Заранее благодарен.
Изменено: VolodiaVG - 24.09.2022 11:19:46
 
VolodiaVG, добрый день!
Проблему того, что null при сложении с любыми числами дает null можно решить через List.Sum.
Пример: List.Sum({[Колонка А],[Колонка B],[Колонка C]})
А каким Вы видите результат деления на ноль? Или умножения на null? null считать как 0 или вообще его не учитывать.
Изменено: whateverlover - 24.09.2022 11:42:07
 
Можно так: [Clmn1]??0 + [Clmn2]??0.
Ну и с любыми остальными действиями в примере.
Скобки а примере ни к чему. Они не меняют порядок действий :)
a??b эквивалентно if a <> null then a else b.
 
Цитата
Пример: List.Sum({[Колонка А],[Колонка B],[Колонка C]})
А каким Вы видите результат деления на ноль? Или умножения на null? null считать как 0 или вообще его не учитывать.
Логичный вопрос. Мои источники несколько непредсказуемы, и в какой колонке что появится неизвестно. Может быть и ноль,  для того что бы не перестраивать форму запроса решил это предусмотреть.
И в случае математической некорректности (о которой Вы говорите) предоставленный ноль в расчёте они (источники) понимают, и предупреждены об этом, не корректно - значит ноль и всё.
List.Sum. Спасибо, опробую что то сваять, если что не так, извините буду писать-уточнять.
Изменено: VolodiaVG - 24.09.2022 20:28:55
 
Цитата
написал:
Можно так: [Clmn1]??0 + [Clmn2]??0.
Прошу прощения, не так просто и whateverlover сразу уловил данный момент. Кавычки же, я писал, чисто для "спокойствия" эксел, не обращайте внимания.
Остальное a??b эквивалентно if a <> null then a else b, не совсем понял, но за внимание спасибо, покопаюсь. .  
 
Я просто к тому, что, например, сдают в школе дети деньги. 30 человек по 100 рублей, но по одному нет информации. Т.е. null. Если сделаем 29*100 + null, то получим null в PQ. Логично этот null заменить на 0 и получим наши 2900. А можно считать так, что, по умолчанию, человек по которому нет информации о сдаче денег, считается что деньги сдал. Тогда null нужно заменить на 100.
Или есть некий коэфициент на который мы умножаем, который может быть не указан. Если его заменить на 0, то все что мы на него умножим станет нулем. Тут, вроде бы, логичней заменить на 1.
Т.е. надо смотреть по ситуации, но общий случай Суркени показал. Надо заменить на ноль пишите a??0, надо на 100, пишите a??100 и т.д.
А вот как деление на 0 избежать не знаю  :) в DAX есть специальная функция для этого DIVIDE, которая 0 даст при деление на ноль, опять же вопрос ноль ли надо в результате получить или нет.
 
Цитата
написал:
Я просто к тому, что, например, сдают в школе дети деньги. 30 человек по 100 рублей, но по одному нет информации. Т.е. null. Если сделаем 29*100 + null, то получим null в PQ. Логично этот null заменить на 0 и получим наши 2900. А можно считать так, что, по умолчанию, человек по которому нет информации о сдаче денег, считается что деньги сдал. Тогда null нужно заменить на 100.
Или есть некий коэфициент на который мы умножаем, который может быть не указан. Если его заменить на 0, то все что мы на него умножим станет нулем. Тут, вроде бы, логичней заменить на 1.
Т.е. надо смотреть по ситуации, но общий случай Суркени показал. Надо заменить на ноль пишите a??0, надо на 100, пишите a??100 и т.д.
А вот как деление на 0 избежать не знаю   в DAX есть специальная функция для этого DIVIDE, которая 0 даст при деление на ноль, опять же вопрос ноль ли надо в результате получить или нет.
Я подозревал что язык М развращает людей. :)
По делу. Если информации о сдаче человеком нет, то это милейший ноль, это наиболее логично. По специфике влияния null вы все правильно уловили, в нём большая часть проблемы.
На DAX пока не вариант, пытаюсь решить вопросы на этом уровне. Суркени догадываюсь что по делу, но если на это смотреть со слабого (моего) уровня, то несколько туманно.
Спасибо, определённая инфа получена будем ваять...
Изменено: VolodiaVG - 24.09.2022 20:49:24
 
Цитата
VolodiaVG написал:
Мои источники несколько непредсказуемы…
И в случае математической некорректности… они (источники) понимают, и предупреждены об этом.
Вы там поаккуратнее с тем, что курите:)

Я так и не понял, что хочет ТС. Если вы хотите избежать результата null для суммы, то можно:

1. a + b = List.Sum ( { a, b } )
a - b = List.Sum ( { a, -b } )

2. a + b = a??0 + b??0
a - b = a??0 - b??0

a??0 - значит «Если a равно null, то заменяем на 0, иначе a».
 
Цитата
написал:
Цитата
VolodiaVG написал:
Мои источники несколько непредсказуемы…
И в случае математической некорректности… они (источники) понимают, и предупреждены об этом.
Вы там поаккуратнее с тем, что курите:)
:D ...за неимением другого, курим то что имеем.
Спокойно, под источниками я имел ввиду тех кто формирует исходные данные,  а у них проблемы с этим.
Спасибо за разъяснения Суркени, буду работать, не получится - буду надоедать.
Страницы: 1
Наверх