Задание 3: анализ табличных баз данных

Задание 3 (базовый уровень): фильтрация и подсчёт записей в табличной базе данных.

Табличная база данных — это одна или несколько связанных таблиц, где строки (записи) описывают объекты, а столбцы (поля) — их свойства. Задание 3 проверяет умение находить записи по условиям.

Что проверяет задание

В задании 3 даётся база данных в файле .ods (электронная таблица) — обычно одна или две связанные таблицы. Нужно ответить на вопрос вида «сколько записей удовлетворяют условию» или «найти суммарное/максимальное значение поля для отобранных строк». Это самое «офисное» задание: его естественно решать в LibreOffice Calc через фильтры и функции. Но для тренировки логики удобно разобрать тот же подход на Python.

Одна таблица: фильтрация и подсчёт

Пусть есть таблица товаров на складе. Вопрос: сколько товаров с количеством больше 20 и ценой меньше 50? В электронной таблице это делается функцией СЧЁТЕСЛИМН (COUNTIFS) или автофильтром. На Python — списковым включением:

rows = [
    {"товар": "А", "кол": 50, "цена": 12},
    {"товар": "Б", "кол": 30, "цена": 40},
    {"товар": "В", "кол": 80, "цена": 5},
    {"товар": "Г", "кол": 10, "цена": 100},
    {"товар": "Д", "кол": 25, "цена": 60},
]
sel = [r for r in rows if r["кол"] > 20 and r["цена"] < 50]
print("подходящих записей:", len(sel))
print("товары:", [r["товар"] for r in sel])

Вывод:

подходящих записей: 3
товары: ['А', 'Б', 'В']

Агрегаты: сумма, максимум, среднее

Вторая частая разновидность — посчитать суммарное или максимальное значение по отобранным записям. В таблицах это СУММЕСЛИ/СУММЕСЛИМН (SUMIFS), МАКС (MAX); на Python — встроенные sum, max:

rows = [
    {"товар": "А", "кол": 50, "цена": 12},
    {"товар": "Б", "кол": 30, "цена": 40},
    {"товар": "В", "кол": 80, "цена": 5},
    {"товар": "Г", "кол": 10, "цена": 100},
]
# суммарное количество товаров дешевле 50 рублей
sel = [r for r in rows if r["цена"] < 50]
print("суммарное количество:", sum(r["кол"] for r in sel))
print("максимальная цена среди них:", max(r["цена"] for r in sel))

Вывод:

суммарное количество: 160
максимальная цена среди них: 40

Две связанные таблицы

Чаще в задании 3 две таблицы, связанные общим ключом. Например, таблица «Сотрудники» (ID, имя, ID_отдела) и таблица «Отделы» (ID_отдела, название, город). Вопрос: сколько сотрудников работает в отделах города «Казань»? Это операция соединения (JOIN): по каждому сотруднику находим его отдел и проверяем город.

otdely = {
    1: {"назв": "Продажи",  "город": "Казань"},
    2: {"назв": "Логистика", "город": "Москва"},
    3: {"назв": "ИТ",        "город": "Казань"},
}
sotrudniki = [
    {"имя": "Аня",   "otdel": 1},
    {"имя": "Боря",  "otdel": 2},
    {"имя": "Вера",  "otdel": 3},
    {"имя": "Гриша", "otdel": 1},
    {"имя": "Дима",  "otdel": 2},
]
# сотрудники, чей отдел в Казани
sel = [s for s in sotrudniki if otdely[s["otdel"]]["город"] == "Казань"]
print("сотрудников в Казани:", len(sel))
print("это:", [s["имя"] for s in sel])

Вывод:

сотрудников в Казани: 3
это: ['Аня', 'Вера', 'Гриша']

Сортировка и поиск экстремумов

Часть вопросов задания 3 связана с порядком: «какой товар на третьем месте по цене», «найдите запись с максимальным значением среди отобранных». В таблицах это сортировка столбца, на Python — функция sorted с ключом. Разберём: «Среди товаров дороже 10 рублей найдите второй по величине запас (поле "кол")».

rows = [
    {"товар": "А", "кол": 50, "цена": 12},
    {"товар": "Б", "кол": 30, "цена": 40},
    {"товар": "В", "кол": 80, "цена": 5},
    {"товар": "Г", "кол": 10, "цена": 100},
    {"товар": "Д", "кол": 70, "цена": 25},
]
# отбираем товары дороже 10 и сортируем по убыванию количества
sel = [r for r in rows if r["цена"] > 10]
sel.sort(key=lambda r: r["кол"], reverse=True)
print("по убыванию запаса:", [(r["товар"], r["кол"]) for r in sel])
print("второй по величине запас — товар:", sel[1]["товар"], "кол:", sel[1]["кол"])

Вывод:

по убыванию запаса: [('Д', 70), ('А', 50), ('Б', 30), ('Г', 10)]
второй по величине запас — товар: А кол: 50

Обратите внимание: товар «В» с количеством 80 в выборку не попал, потому что его цена 5 не больше 10. Это и есть типичная ловушка: сначала фильтр, потом сортировка — порядок операций важен. В электронной таблице порядок тот же: сначала автофильтр по цене, затем сортировка по столбцу количества.

Группировка: сумма по категориям

Ещё один частый вопрос — «суммарный запас по каждому поставщику» или «сколько товаров в каждой категории». В таблицах это сводная таблица или СУММЕСЛИ по каждому значению; на Python удобно собрать словарь-накопитель:

from collections import defaultdict

rows = [
    {"товар": "А", "склад": "Север", "кол": 50},
    {"товар": "Б", "склад": "Юг",    "кол": 30},
    {"товар": "В", "склад": "Север", "кол": 80},
    {"товар": "Г", "склад": "Юг",    "кол": 10},
    {"товар": "Д", "склад": "Север", "кол": 70},
]
itog = defaultdict(int)
for r in rows:
    itog[r["склад"]] += r["кол"]      # накапливаем по складу
for sklad, total in itog.items():
    print(sklad, "->", total)

Вывод:

Север -> 200
Юг -> 40

Как это делать в электронной таблице (реальный экзамен)

На самом экзамене базу выдают в .ods, и быстрее всего работать прямо в LibreOffice Calc:

  • Подсчёт по условию — функция СЧЁТЕСЛИМН (COUNTIFS): задаёте диапазоны и условия, получаете количество.
  • Сумма по условиюСУММЕСЛИМН (SUMIFS).
  • Связь таблиц — функция ВПР (VLOOKUP) подтягивает данные из второй таблицы по ключу, после чего фильтруете обычным автофильтром.
  • Автофильтр — для визуальной проверки: наложить условия на столбцы и посмотреть, сколько строк осталось.

Python в этом задании — резервный и тренировочный инструмент: он помогает понять логику фильтрации и связей. На реальном КЕГЭ для задания 3 чаще выбирают таблицы, потому что данные уже в .ods.

Типичные ловушки

  • Строгое или нестрогое неравенство. «Больше 20» — это > 20 (без 20), «не менее 20» — это ≥ 20. Читайте формулировку точно.
  • И против ИЛИ. «Количество больше 20 и цена меньше 50» — оба условия; «или» — достаточно одного.
  • Связь таблиц по ключу. Не перепутайте, какое поле является ключом связи (ID отдела), а какое — просто данными.
  • Дубликаты и пустые ячейки в реальной базе могут испортить подсчёт — проверяйте крайние записи.

Итог

  • Задание 3 — фильтрация и подсчёт записей в табличной базе; на экзамене удобнее всего электронные таблицы (.ods).
  • Подсчёт — СЧЁТЕСЛИМН, сумма — СУММЕСЛИМН, связь таблиц — ВПР; на Python это списковые включения и sum/max.
  • Главные ловушки — путаница строгих/нестрогих неравенств и И/ИЛИ в условиях.
Проверьте себя
1. Какой функцией электронных таблиц удобно подсчитать число записей по нескольким условиям?
AСУММ (SUM)
BСЧЁТЕСЛИМН (COUNTIFS)
CВПР (VLOOKUP)
DСРЗНАЧ (AVERAGE)
2. Что означает условие «количество не менее 20»?
Aкол > 20
Bкол >= 20
Cкол < 20
Dкол == 20
3. Для чего в задании 3 с двумя таблицами используют функцию ВПР (VLOOKUP)?
AДля сортировки данных
BЧтобы подтянуть данные из второй таблицы по общему ключу
CДля подсчёта суммы
DДля построения диаграммы
Поддержать проект