🔗 Як витягнути пов’язані дані в Notion, якщо бази пов’язані не напряму
У роботі з Notion нерідко виникає ситуація, коли потрібно відобразити дані з бази даних, яка не пов’язана напряму, а лише через іншу базу.
У цій статті покажу, як за допомогою функцій lets
і map
можна обійти це обмеження і “витягнути” потрібну інформацію. Розглянемо це на простому прикладі — CRM-системи в Notion.
📦 Приклад: Клієнти, Замовлення і Товари
Уявімо, що у нас є три таблиці (три бази даних):
- Клієнти — це ваші покупці
- Замовлення — що саме і коли вони купили
- Товари — що саме ви продаєте
Зв’язки:
- Кожен Клієнт має одне або кілька Замовлень
- Кожне Замовлення містить один або кілька Товарів
🔗 Але Клієнт напряму не пов’язаний із Товарами. І саме це ми хочемо вирішити.
🎯 Мета: побачити, які Товари купував кожен Клієнт
Зробимо це за кілька кроків у базі Клієнти за допомогою lets
і map
.
“Чому саме lets
? Бо він дозволяє зберігати кілька змінних одразу і повернути будь-яку з них у кінці.”
🛠️ Крок 1: Створити зв’язок
Переконайтесь, що:
- База Клієнти пов’язана з базою Замовлення (через поле типу Relation, двобічний зв’язок)
- База Замовлення пов’язана з базою Товари (теж через Relation, двобічний зв’язок)
- [нагадаю, Клієнти і Товари у нас не пов’язані між собою напряму, а Замовлення має зв’язок і з Клієнти, і з Товари]
🧠 Крок 2: Витягуємо товари через lets
і map
У базі Клієнти створюємо нове поле “Товари” типу Formula і вставляємо формулу:
Що вона робить?
prop("Замовлення")
— бере всі замовлення, пов’язані з поточним клієнтом
.map(...)
— проходиться по кожному замовленню
current.prop("Товари")
— дістає список товарів у кожному замовленні
.map(current.prop("Name"))
— бере назви цих товарів
.join("\\n")
— перетворює назви товарів у стовпчик (один товар — один рядок)
- зовнішній
.join("\\n")
— об’єднує всі такі списки товарів з усіх замовлень клієнта в єдиний перелік
🧠 Таким чином, формула витягує всі назви товарів, які були в замовленнях клієнта, і показує їх вертикальним списком — чисто, зрозуміло й без зайвих ком.
👉 Порада: Додай маркери для зручності читання
Щоб зробити список товарів візуально приємнішим, можна додати маркер •
перед кожною назвою. Для цього трохи змінимо формулу:
🔍 Що змінилось:
"• " + current.prop("Name")
— додає символ перед кожною назвою товару.
📌 У підсумку отримаємо акуратний список із булітами, який легко сприймається навіть при великій кількості товарів.
🧠 Крок 3: Витягуємо всі потрібні дані
***(ціни, загальна сума)***
Коли в базі Товари вже є ціни — слушно прямо в базі Клієнти витягнути вартість кожного товару і загальну суму їх вартості. Це додасть завершеності процесу, покаже повну картину по клієнту, і дасть змогу робити аналіз без переходів між таблицями.
Тут знову стануть в пригоді lets
, map
і join
, і додамо новеньке — sum
, щоб порахувати загальну вартість.
➕ Додаємо формулу Товари (2)
в таблицю Клієнти:
🧾 Що вона робить:
-
товари — витягує всі назви товарів із замовлень клієнта, додає ціну, і форматує у вигляді списку
-
сума — проходить по всіх замовленнях → товарах → бере Ціна
і підсумовує все разом
-
У фіналі — поєднуємо список і загальну суму в одному полі
🧾 Що ця формула робить — докладно
-
Ця формула працює з кількома вкладеними списками й обчисленнями. Розберімо її по кроках:
1. Отримуємо список усіх товарів із замовлень клієнта
Що тут відбувається?
-
prop("Замовлення")
— витягує всі пов’язані замовлення цього клієнта. Це список.
-
.map(...)
— проходиться по кожному замовленню.
-
current.prop("Товари")
— у кожному замовленні ми звертаємось до пов’язаних товарів.
-
Другий .map(...)
— проходить по кожному товару в цьому замовленні.
-
"• " + current.prop("Name") + " — " + format(current.prop("Ціна")) + " грн"
— формує рядок для кожного товару:
наприклад, • Хліб — 30 грн
-
.join("\\n")
— поєднує товари в одне замовлення
-
Потім зовнішній .join("\\n")
— об’єднує усі замовлення в єдиний перелік товарів
✅ У результаті ми отримуємо гарно відформатований повний список усіх товарів, які коли-небудь замовляв клієнт — незалежно від кількості замовлень.
2. Підраховуємо загальну суму замовлених товарів
Як це працює?
- Знову проходимося по кожному замовленню.
current.prop("Товари").map(current.prop("Ціна"))
— витягуємо всі ціни товарів у кожному замовленні.
.sum()
— підсумовуємо ці ціни в межах одного замовлення.
- Другий
.sum()
— підсумовує всі суми по замовленнях, тобто загальна сума витрат клієнта на всі товари.
✅ Таким чином, ми маємо точне фінальне число — загальну суму витрачених клієнтом коштів.
3. Об'єднуємо все в один фінальний блок тексту
- Додаємо подвійний перенос рядка (
\n\n
) для відступу.
- Форматуємо суму як текст.
- Додаємо слово “Загальна сума” — для зрозумілого підпису.
✅ У фіналі ми отримуємо одне зручне поле, яке виглядає, наприклад, так:
Цей підхід ідеально підходить для аналітики на рівні клієнта: він поєднує деталізацію (що саме замовляли) з узагальненням (на яку суму). І найкраще — все автоматично оновлюється при зміні даних у базах Замовлення та Товари.
✨ Тепер клієнтська картка виводить повний перелік товарів і підсумкову суму — все автоматично.
🧩 Що ще можна зробити
- Додати розбивку по замовленнях із датами
- Групувати товари по категоріях
- Порахувати кількість кожного товару
- Побудувати дашборд із витратами клієнтів
🧩 Як застосувати цей підхід в інших випадках?
Цей підхід із lets
, map
і join
можна адаптувати до будь-якої ситуації, де потрібно отримати інформацію через проміжну базу. Це відкриває безліч можливостей — не тільки для бізнесу.
Декілька прикладів з різних сфер:
🧑🏫 Освіта
-
Показати всі теми, які вивчав студент, через базу “Заняття”
(Студенти → Заняття → Теми)
-
Зібрати всі оцінки студента по різних предметах через “Контрольні роботи”
📚 Особисті проєкти
- Сформувати список книг, прочитаних у рамках челенджу, через базу “Читання”
- Вивести всі епізоди улюбленого серіалу, які ти вже подивився, через базу “Переглянуте”
👨👩👧👦 Для сім'ї
- Показати всі секції, які відвідує дитина, через базу “Розклад”
- Зібрати всі іграшки, які подарували родичі, через базу “Подарунки”
🏕 Волонтерство або події
- Перелік завдань, які виконав волонтер, через базу “Зміни/чергування”
- Список заходів, де брала участь організація, через “Календар подій”
📌 Якщо коротко: у будь-якому випадку, де є ланцюжок типу А → В → С, цей підхід дозволяє “витягнути” С з точки А — легко, красиво і без зайвих ролапів.