Три связанные таблицы, один вопрос, одно число в ответе.
Решаем в электронных таблицах — так это делают на экзамене.
Базовый уровень, один балл. На экзамене к заданию прилагается файл: открыть, посчитать, вписать число.
«Определите общую массу (в кг) всех видов зефира, поступивших в магазины, расположенные на Прибрежной улице, за период с 5 по 19 июня включительно».
В файле три листа:
| Движение товаров | ID операции · Дата · ID магазина · Артикул · Количество упаковок · Тип операции | ≈ 6 500 строк |
|---|---|---|
| Товар | Артикул · Отдел · Наименование · Ед_изм · Количество в упаковке · Цена | 60 строк |
| Магазин | ID магазина · Район · Адрес | 18 строк |
Ни слова «зефир», ни слова «Прибрежная» в большой таблице нет. Там только номера.
Два действия. Всё остальное — внимательность к условию.
| Движение товаров | ключ | справочник |
|---|---|---|
| столбец Артикул | → | Товар: наименование, единица, сколько в упаковке, цена |
| столбец ID магазина | → | Магазин: район и адрес |
Большая таблица отвечает на вопрос «сколько и когда». Справочники — на вопрос «чего именно и где».
Это и есть база данных: данные не дублируются. Название товара записано один раз, а не шесть тысяч.
| 1 | Выписать условия из вопроса: что суммируем, тип операции, даты, место, товар. |
|---|---|
| 2 | Найти в справочниках коды: артикулы нужных товаров, ID нужных магазинов. |
| 3 | В таблице движения сделать вспомогательный столбец: значение строки. |
| 4 | Отфильтровать по условиям и прочитать сумму внизу, в строке состояния. |
Шаг 1 пропускают чаще всего — и теряют балл не на формуле, а на невыписанном условии.
«Магазины на Прибрежной улице» приходится искать в столбце Адрес: там лежит «Прибрежная, 7» — улица и дом одной строкой. Отдельного поля «Улица» не существует, и это нарочно.
= E2 * ВПР(D2; Товар.$A:$F; 5; 0)
D2 | что ищем — артикул из этой строки |
|---|---|
Товар.$A:$F | где ищем; искомое обязано быть в первом столбце диапазона |
5 | номер столбца внутри диапазона, а не на листе: пятый — «Количество в упаковке» |
0 | точное совпадение. Без нуля формула возьмёт «ближайшее» и тихо соврёт |
Так же подтягивается район магазина:
= ВПР(C2; Магазин.$A:$C; 2; 0).
В Excel лист отделяется восклицательным знаком:
Товар!$A:$F. В LibreOffice — точкой.
Выделить шапку таблицы движения, Данные → Автофильтр. Дальше список условий из шага 1 превращается в список фильтров:
| условие | где и как |
|---|---|
| тип операции | «Тип операции»: оставить Поступление |
| период | «Дата»: Стандартный фильтр — >= первая
дата И <= последняя |
| место | столбец района или адреса из ВПР: район — галочкой, улица — «содержит» |
| товар | столбец наименования из ВПР: «начинается с» слова вида |
Условий столько, сколько их в вопросе. Ставя следующий фильтр, не сбрасывай предыдущие — они действуют все вместе.
Внизу показано «Среднее» или «Количество»? Правой кнопкой по строке состояния — выбрать «Сумма». Формулы для сложения не нужны вовсе.
| в вопросе | что брать |
|---|---|
| «поступило», «получено» | только Поступление |
| «продано», «выручка» | только Продажа |
| «на сколько увеличилось количество» | Поступление минус Продажа |
Сложить вместо вычитания — самая частая ошибка этого типа. Число получается правдоподобное, и проверить себя нечем.
Спрашивают кг и литры — делим на 1000.
Упаковка дробная (0,5 кг) — не делим, уже в нужных единицах.
Готовый вес — не делим ни на что.
Столбец «Ед_изм» в справочнике — не украшение. Смотреть на него до того, как написана формула.
Цена в справочнике «Товар» — одна на всё время.
= E2 * ВПР(D2; Товар.$A:$F; 6; 0)
Цена в самой строке движения: она менялась по дням, и в справочнике её просто нет.
= E2 * G2
Первым делом — посмотреть на шапку таблицы движения. Есть там столбец с ценой или нет.
Листы сохраняются в CSV (Файл → Сохранить как → Текст CSV,
разделитель ;), дальше обычный цикл:
tovar = {r['Артикул']: r for r in read('Товар.csv')}
magaz = {r['ID магазина']: r for r in read('Магазин.csv')}
итог = 0
for r in read('Движение.csv'):
t = tovar[r['Артикул']]
m = magaz[r['ID магазина']]
if (r['Тип операции'] == 'Поступление'
and t['Наименование товара'].startswith('Зефир')
and 'Прибрежная' in m['Адрес']
and (2025, 6, 5) <= dat(r['Дата']) <= (2025, 6, 19)):
итог += int(r['Количество упаковок, шт']) * int(t['Количество в упаковке'])
Словарь по ключу — тот же ВПР, только руками. На экзамене в задании 3 это дольше; но в заданиях 9, 26 и 27 таблицы уже не тянут, и путь понадобится.
Шесть задач, по одной на каждый тип. У каждого свой файл: страница соберёт базу и отдаст кнопкой.