Пойдём на представление данных, представление таблиц, где непосредственно наши таблицы. Начнём с создания столбцов. Сейчас начну тихонько ускоряться и не буду писать формулы от руки — одну напишу, остальные по образу и подобию, потому что в полтора часа очевидно не впишемся.
Сумма заказа. Идём в заказы и обращаем внимание на следующую штуку: у нас в заказах нет денег. А где они есть? Деньги есть только в одном месте — в продуктах: у продуктов есть стоимость по прайсу, в соответствии с этой стоимостью курс выложен на сайте. Чтобы посчитать стоимость заказа, нужно учесть несколько вещей. Во-первых, каждая строчка заказа — это отсылка на какой-то продукт: я взяла рандомный, это 17-й продукт, то есть у него где-то в соседней таблице ценник есть. Но этот 17-й продукт продали с какой-то скидкой по промокоду — здесь промокода нет, окей, здесь нет скидки, но где-то там внизу они точно есть, а продали со скидкой. И более того, возможно, не дошли до нас деньги, потому что у нас есть три статуса оплаты, и только один из них успешный. Соответственно, чтобы посчитать итоговую сумму заказа, надо учесть стоимость по прайсу, учесть промокод на скидку, если он есть, и учесть статус оплаты: только в случае успешности статуса мы можем на какую-то сумму претендовать.
Создаю столбец «Сумма заказа». Начну с простого и буду наращивать вычисления по мере логики. Первое: вытащим ценник из продуктов, тот, который по прайсу. Так как продукты с заказами связаны, у нас есть функция, которая вытаскивает значения; их, на самом деле, две, они работают в разную сторону. Есть RELATED — вытаскивает значение из связанной таблицы в том случае, если оно единственное, то есть с той стороны, где связь один ко многим и стоит единичка: с той стороны мы можем вытащить значение, потому что оно априори должно быть единственным, если оно в принципе есть. RELATEDTABLE работает в обратную сторону, но обязательно с агрегацией. Я написала функцию RELATED, открыла скобочку — и у меня перечень всех полей, доступных мне в контексте этой функции; мне нужны продукты, мне нужна стоимость по прайсу. Скобочку не забываем закрывать. Я выбрала из списка, не писала ни кавычек, ни скобок. Из таблицы с продуктами колонка «Стоимость по прайсу» — для каждого продукта приедет значение. Нажимаю Enter и могу сходить в соседнюю таблицу и убедиться, что у 17-го продукта цена 37 500 — не больше, не меньше, это та сумма, которая пришла бы нам, если бы не было скидок и статусов оплаты. Но они есть.
Теперь учтём скидку. У нас есть промокоды, они тоже есть идентификаторы, не везде они есть, но по тому же принципу, что и стоимость продукта, мы можем вытащить скидку по промокоду и на неё умножить. Но умножим не на саму скидку — нам нужна единица минус скидка. Дальше — таблица с промокодами и наш процент скидки, который мы создавали в Power Query. Скобку закрыла, сейчас RELATED. Теперь что получилось: та цена по прайсу, которая была, умножается на единицу минус процент скидки — осталась та сумма, которая за вычетом скидки. В том случае, когда промокода нет, здесь просто будет пустота, и у нас останется единичка. Нажал Enter — выглядит так, как будто ничего не поменялось, но потому что промокода здесь нет. Если долистаем туда, где промокоды должны добавиться, — вот они, тут уже не такие ровные циферки, и мы понимаем, что скидка тут посчиталась.
Возвращаемся обратно. Мы учли два фактора, у нас ещё есть третий: статус оплаты. Мы должны посчитать сумму заказа только для ситуации, когда статус оплаты успешный. Сходим в таблицу со статусами оплаты и увидим, что у нас есть поле, отвечающее за успешность. Если для нашего заказа у статуса оплаты это поле true — то мы считаем, иначе не считаем. Здесь мы можем использовать функцию IF — она есть абсолютно, наверное, во всех языках программирования, где-то чуть различающихся вариантах синтаксиса; принимает все три аргумента: первое — утверждение, которое мы проверяем (статус оплаты истинен или не истинен), второй — то, что возвращается в случае, если проверенное утверждение истинно, и третий — если нет. Возвращаемся в заказы, в нашу формулу. Когда щёлкаем на столбец, высвечивается формула, мы можем её редактировать. Я сейчас эту штуку вырежу, то есть сохраню в буфере — главное не стереть, — и напишу следующее: IF, открываю скобку, у меня подсвечивается три аргумента — логическое выражение, результат если истинна и необязательный результат если ложь; если третий аргумент не указываем, получаем blank, пустое значение. Логическое выражение: опять же, та же функция RELATED — из статусов оплат вытаскиваем поле is_success. Если вот эта истина — то вставляем наше вычисление, и закрываем скобку, потому что ничего, кроме пустоты, нам на второй вариант возвращать не надо. Теперь у нас в строчках, где статус оплаты не успешный, такая веющая пустота, а мы посчитали сумму заказа.