Задание 3 ЕГЭ: поиск в базе данных

11 класс, углублённый уровень. Практикум: три связанные таблицы, вопрос про сумму по нескольким условиям. Решаем в электронных таблицах.

Что нужно сделать
Шесть задач, по одной на тип — все на экране сразу, решай в любом порядке. К каждой страница выдаёт свой файл базы: скачай его, открой в электронных таблицах, посчитай и введи число. У соседа файлы другие: списать нечего.
Баллы
По баллу за задачу, всего 6: шесть — «5», пять — «4», четыре — «3».
Ошибся — не страшно
Разбор появится сразу — с числами твоей базы. Потом кнопка «Новая база» даст задачу того же типа с другим файлом: балл можно доработать. Отдельно видно, сколько сделано с первой попытки.
Ответ
Целое число, без пробелов, без «кг» и «руб.»: 1630, а не 1 630 кг. Сверка знак в знак, как на КЕГЭ.
Как решать в электронных таблицах — четыре шага
шагчто делаем
1Читаем вопрос и выписываем условия: что суммируем, какой тип операции, какие даты, какое место, какой товар.
2На листах-справочниках находим коды: артикулы нужных товаров («Товар») и ID нужных магазинов («Магазин»). Улица видна только в столбце «Адрес» — поля «Улица» в базе нет.
3В таблице движения делаем вспомогательный столбец со значением строки: масса, выручка или просто количество.
4Ставим автофильтр по каждому условию, выделяем вспомогательный столбец — и читаем Сумму внизу, в строке состояния. Формулы для сложения не нужны.

Подробно — в подсказке внизу страницы.

Задачи

баллов 0 из 6, это2

Подсказка: формулы для задания 3

Вспомогательный столбец — главное действие

Связать три таблицы значит подтянуть к каждой строке движения то, чего в ней нет: характеристику товара и место магазина. Делает это ВПР (в англоязычной версии VLOOKUP). Пусть в строке 2 таблицы движения артикул стоит в столбце D, а количество упаковок — в E:

= E2 * ВПР(D2; Товар.$A:$F; 5; 0)     масса строки в граммах
= E2 * ВПР(D2; Товар.$A:$F; 6; 0)     выручка строки в рублях
= ВПР(C2; Магазин.$A:$C; 2; 0)        район магазина
= ВПР(C2; Магазин.$A:$C; 3; 0)        адрес магазина

Третий аргумент ВПР — номер столбца в справочнике, считая от первого столбца диапазона. Четвёртый — 0: точное совпадение, иначе формула тихо возьмёт соседнюю строку.

В Excel лист отделяется восклицательным знаком: Товар!$A:$F. В LibreOffice — точкой: Товар.$A:$F. Всё остальное одинаково.

Отобрать фильтром и прочитать сумму внизу

Формулы для сложения не нужны. Выделить шапку таблицы движения, включить автофильтр (Данные → Автофильтр) и оставить только нужные строки — по одному условию на столбец:

условиефильтр
тип операциив столбце «Тип операции» отметить только Поступление (или только Продажа)
периодв столбце «Дата» — Стандартный фильтр: >= первая дата И <= последняя (в Excel: Фильтры по дате → Между)
местопо столбцу района или адреса, подтянутому ВПР: район — отметить нужный, улица — условие «содержит» с названием улицы
товарпо столбцу наименования, подтянутому ВПР: «начинается с» слова вида — или отметить нужные артикулы

Когда остались только нужные строки, выделить вспомогательный столбец (щелчок по букве столбца) и посмотреть вниз, в строку состояния: там стоит «Сумма: …», и считает она только видимые строки. Если внизу показано «Среднее» или «Количество» — щёлкнуть по строке состояния правой кнопкой и выбрать «Сумма».

Заголовок столбца в сумму не попадает — это текст. Скрытые фильтром строки не попадают тоже, в этом и смысл. Ставя следующий фильтр, не сбрасывай предыдущие: условия действуют все вместе.

Три ловушки, на которых теряют балл

Второй способ: то же самое на Python

Пользоваться им на уроке не обязательно — это запасной ход и мостик к заданиям 9, 26 и 27, где данных больше и таблицы уже не тянут. Сначала сохранить нужные листы: Файл → Сохранить как → Текст CSV, разделитель ;, кодировка UTF-8 — по файлу на лист.

import csv

def read(name):
    return list(csv.DictReader(open(name, encoding='utf-8'), delimiter=';'))

tovar = {r['Артикул']: r for r in read('Товар.csv')}
magaz = {r['ID магазина']: r for r in read('Магазин.csv')}

def dat(s):                       # '05.09.2025' -> (2025, 9, 5)
    d, m, y = s.split('.')
    return (int(y), int(m), int(d))

итог = 0
for r in read('Движение.csv'):
    t = tovar[r['Артикул']]
    m = magaz[r['ID магазина']]
    if (r['Тип операции'] == 'Поступление'
            and t['Наименование товара'].startswith('Зефир')
            and 'Прибрежная' in m['Адрес']
            and (2025, 9, 5) <= dat(r['Дата']) <= (2025, 9, 19)):
        итог += int(r['Количество упаковок, шт']) * int(t['Количество в упаковке'])

print(итог / 1000)

Даты сравниваются кортежами (год, месяц, день): строки '05.09.2025' сравнивать нельзя — по ним сентябрь окажется раньше мая.

Откуда эти задачи

Задачи авторские, составлены в форме задания 3 ЕГЭ по информатике. Форма задания и способ решения — как на экзамене, а условия написаны своими словами. База данных, период и вопрос каждый раз новые.

Материалы подготовлены с использованием технологий искусственного интеллекта.