Объединение таблиц в FineBI размножает показатели при неуникальном ключе
Объединение таблиц «слева-справа» в FineBI выглядит как способ поставить две таблицы рядом. Работает оно как join по строкам, и при неуникальном ключе показатели копируются, а итог после суммирования выходит неверным.
На форуме FanRuan это всплыло в двух вопросах пользователей FineBI. В первом продажи хранятся построчно по заказам и уже сведены в среднедневные продажи по артикулу (SKU), а остатки лежат отдельной сводной таблицей по SKU, без заказов. Нужен отчёт об оборачиваемости запасов, но прямое объединение двух таблиц даёт проблемы. Во втором хотели показать рядом две таблицы показателей с одинаковыми измерениями.
Способы объединения в FineBI повторяют SQL: левое работает как left join, правое как right join, пересечение как inner join, полное как full join. Это объединение на уровне строк. Если значение ключа встречается несколько раз, строки второй таблицы копируются под каждое совпадение.
На примере из первого вопроса это видно сразу. В таблице остатков у артикула одна строка, а в продажах по заказам у того же артикула их столько, сколько было заказов. После объединения остаток повторится в каждой строке заказа, и сумма остатков по этому SKU умножится на число его заказов.
Копия измерения анализу не вредит. Копия показателя после суммирования даёт неверный итог. Хуже всего при связи «многие ко многим».
Ещё две детали ключа легко пропустить. Поля с одинаковыми именами FineBI сам добавляет в условие объединения. А пустые значения (null) в ключе друг с другом не совпадают, и строки с ними теряются. Источник предлагает заменить null, например, на «0». Я бы делал это осторожно: если пустых ключей с каждой стороны несколько или «0» уже встречается как настоящий код, замена сама даст «многие ко многим».
Продажи и остатки - две таблицы фактов, и склеивать их не нужно вовсе. Ответ на форуме предлагает связать их в модели аналитической темы. Модель сначала агрегирует каждую таблицу, потом соединяет, и раздувания нет.
У модели своя граница. Несколько таблиц фактов в FineBI не могут делить несколько таблиц измерений. Если, кроме SKU, нужны бренд и категория, их сначала сводят в одну таблицу измерений и уже её связывают с продажами и с остатками.
А когда оба показателя из одной таблицы, склейка не нужна совсем: в кросс-таблице задают измерение и кладут оба показателя рядом.
Из устройства следует простое правило, и я бы держал его по умолчанию. Две таблицы фактов связываются в модели. Объединение остаётся для случаев, когда ключ уникален, при необходимости составной из нескольких полей. Проверить уникальность ключа дешевле, чем потом искать, откуда в итогах лишнее.
Вопросы на форуме FanRuan: https://bbs.fanruan.com/wenda/question/231737.html и https://bbs.fanruan.com/wenda/question/231767.html
#FineBI #FanRuan #BI #моделированиеданных #аналитикаданных #бизнесаналитика
Post #1083
110
