SQLLab
Все статьи

SQL для Excel-аналитика: переходим с таблиц на запросы

Как перейти с Excel на SQL: аналоги VLOOKUP, сводных таблиц, фильтров и формул. Практическое руководство для аналитиков, знающих Excel.

23 марта 2026 г.·5 мин чтения·

Если вы умеете работать в Excel — вы уже понимаете логику SQL. Большинство Excel-операций имеют прямые аналоги в SQL. Это руководство для тех, кто хочет перейти с таблиц на запросы.

Таблица → SQL: основная параллель

Excel таблица       SQL таблица
Лист               → FROM table_name
Строки             → Строки (rows)
Столбцы            → Столбцы (columns)
Фильтр             → WHERE
Сортировка         → ORDER BY
Скрыть столбцы     → SELECT col1, col2 (только нужные)

Фильтр (AutoFilter) → WHERE

Excel: Фильтр → Категория = "Электроника" И Цена > 1000

SQL:
SELECT *
FROM products
WHERE category = 'Электроника'
  AND price > 1000;
Excel: Фильтр → Статус IN ("Новый", "В обработке")

SQL:
SELECT * FROM orders
WHERE status IN ('Новый', 'В обработке');
Excel: Фильтр → Имя содержит "Иван"

SQL:
SELECT * FROM customers
WHERE name LIKE '%Иван%';

Сортировка → ORDER BY

Excel: Сортировка по дате (новые сверху), затем по сумме

SQL:
SELECT * FROM orders
ORDER BY created_at DESC, amount DESC;

Сводная таблица → GROUP BY

Сводная таблица — самый мощный инструмент Excel. В SQL это GROUP BY.

Excel Сводная: Строки=Категория, Значения=Сумма продаж

SQL:
SELECT
    category,
    SUM(amount) AS total_sales
FROM orders
GROUP BY category
ORDER BY total_sales DESC;
Excel Сводная: Строки=Категория, Столбцы=Месяц, Значения=Сумма

SQL (через CASE WHEN):
SELECT
    category,
    SUM(CASE WHEN EXTRACT(MONTH FROM date) = 1 THEN amount END) AS january,
    SUM(CASE WHEN EXTRACT(MONTH FROM date) = 2 THEN amount END) AS february,
    SUM(CASE WHEN EXTRACT(MONTH FROM date) = 3 THEN amount END) AS march
FROM orders
WHERE EXTRACT(YEAR FROM date) = 2026
GROUP BY category;

Агрегатные функции

ExcelSQL
СУММ(A:A)SUM(column)
СРЗНАЧ(A:A)AVG(column)
СЧЁТ(A:A)COUNT(column)
СЧЁТЗ(A:A)COUNT(*)
МИН(A:A)MIN(column)
МАКС(A:A)MAX(column)
СЧЁТЕСЛИ(A:A, "да")COUNT(*) WHERE col = 'да'
СУММЕСЛИ(A:A, "да", B:B)SUM(B) WHERE A = 'да'
-- Excel: СЧЁТЕСЛИМН(status, "completed", amount, ">1000")
SELECT COUNT(*)
FROM orders
WHERE status = 'completed' AND amount > 1000;

ВПР (VLOOKUP) → JOIN

ВПР — поиск значения в другой таблице по ключу. В SQL это JOIN.

Excel:
Таблица1: orders (order_id, user_id, amount)
Таблица2: users (user_id, name, email)
ВПР: =ВПР(B2, users!A:C, 2, 0)  — найти имя по user_id

SQL:
SELECT
    o.order_id,
    o.amount,
    u.name,      -- ← как ВПР нашёл name из users
    u.email
FROM orders o
JOIN users u ON u.id = o.user_id;
ВПР с #Н/Д для ненайденных → LEFT JOIN (сохранить все строки orders):
SELECT
    o.order_id,
    o.amount,
    u.name  -- NULL если пользователь не найден
FROM orders o
LEFT JOIN users u ON u.id = o.user_id;

ЕСЛИ (IF) → CASE WHEN

Excel: =ЕСЛИ(A2>10000; "Крупный"; "Мелкий")

SQL:
SELECT
    order_id,
    amount,
    CASE
        WHEN amount > 10000 THEN 'Крупный'
        ELSE 'Мелкий'
    END AS size_category
FROM orders;
Excel: =ЕСЛИМН(A2>=100000,"Whale", A2>=10000,"Loyal", A2>=1000,"Regular", A2>0,"New", "Inactive")

SQL:
SELECT
    user_id,
    total_spent,
    CASE
        WHEN total_spent >= 100000 THEN 'Whale'
        WHEN total_spent >= 10000  THEN 'Loyal'
        WHEN total_spent >= 1000   THEN 'Regular'
        WHEN total_spent > 0       THEN 'New'
        ELSE 'Inactive'
    END AS segment
FROM user_totals;

ТЕКСТ / Строковые функции

ExcelSQL (PostgreSQL)
ПРОПИСН(A1)UPPER(col)
СТРОЧН(A1)LOWER(col)
ДЛСТР(A1)LENGTH(col)
ЛЕВСИМВ(A1, 3)LEFT(col, 3)
ПРАВСИМВ(A1, 3)RIGHT(col, 3)
СЦЕПИТЬ(A1, " ", B1)A1 || ' ' || B1 или CONCAT(A1,' ',B1)
ПОДСТАВИТЬ(A1,"а","о")REPLACE(col,'а','о')
НАЙТИ("текст", A1)POSITION('текст' IN col)
ПСТР(A1, 3, 5)SUBSTRING(col, 3, 5)
СЖПРОБЕЛЫ(A1)TRIM(col)

Даты

ExcelSQL (PostgreSQL)
СЕГОДНЯ()CURRENT_DATE
ТДАТА()NOW()
ГОД(A1)EXTRACT(YEAR FROM col)
МЕСЯЦ(A1)EXTRACT(MONTH FROM col)
ДЕНЬ(A1)EXTRACT(DAY FROM col)
ДЕНЬНЕД(A1)EXTRACT(DOW FROM col)
A1-B1 (разница в днях)A1 - B1 или DATE_PART('day', A1-B1)
ДАТАМЕС(A1, 1)A1 + INTERVAL '1 month'
ТЕКСТ(A1,"ММММ")TO_CHAR(col, 'Month')
-- Заказы за последние 30 дней
SELECT * FROM orders
WHERE created_at >= CURRENT_DATE - INTERVAL '30 days';

-- Выручка по месяцам
SELECT
    TO_CHAR(created_at, 'YYYY-MM') AS month,
    SUM(amount) AS revenue
FROM orders
GROUP BY 1
ORDER BY 1;

СЧЁТЕСЛИ по уникальным → COUNT DISTINCT

Excel: =СУММПРОИЗВ(1/СЧЁТЕСЛИ(A:A, A:A))  — подсчёт уникальных

SQL:
SELECT COUNT(DISTINCT user_id) AS unique_customers
FROM orders;

Нарастающий итог → SUM() OVER

Excel: =СУММ($B$2:B2)  — нарастающая сумма

SQL:
SELECT
    date,
    revenue,
    SUM(revenue) OVER (ORDER BY date) AS running_total
FROM daily_sales;

Ранжирование → RANK()

Excel: =РАНГ(A2, A:A, 0)

SQL:
SELECT
    name,
    sales,
    RANK() OVER (ORDER BY sales DESC) AS rank
FROM salespeople;

Практический пример: отчёт продаж

Excel: Сводная → Менеджер | Кол-во сделок | Сумма | Средний чек | Доля от итога

SQL:
SELECT
    manager_name,
    COUNT(*)                                    AS deals,
    SUM(amount)                                 AS total,
    ROUND(AVG(amount), 0)                       AS avg_deal,
    ROUND(SUM(amount) / SUM(SUM(amount)) OVER () * 100, 1) AS pct_of_total
FROM sales
WHERE created_at >= '2026-01-01'
GROUP BY manager_name
ORDER BY total DESC;

Главные преимущества SQL над Excel

ExcelSQL
Размер данныхДо ~1M строкМиллиарды строк
ВоспроизводимостьФормулы могут сломатьсяЗапрос всегда одинаков
ВерсионностьФайлы v1, v2, final...Git, история запросов
Совместная работаКонфликты файловВсе работают с одними данными
АвтоматизацияМакросы (сложно)Scheduled queries, dbt

SQL не заменяет Excel — он дополняет. Excel для визуализации и ad-hoc анализа, SQL для получения данных и сложных расчётов на больших объёмах.

Похожие статьи

Попробуй на практике

Тренажёр с реальными задачами — бесплатно и без регистрации

Открыть тренажёр →