Подсчет записей по условию в SQL Server: пример и решение

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

В SQL Server для подсчёта строк, соответствующих определённым критериям, применяется связка SUM и CASE:

SQL
Скопировать код
SELECT SUM(CASE WHEN условие THEN 1 ELSE 0 END) AS УсловныйПодсчет
FROM имяТаблицы;

Вместо условие подставьте нужное вам условие, а имяТаблицы замените на название вашей таблицы.

Если требуется посчитать общее количество строк, рекомендуем использовать COUNT(*), который считает все строки, игнорируя условия.

Кинга Идем в IT: пошаговый план для смены профессии

Условные агрегации с применением SUM и CASE

Если вам необходимо вычислить условный подсчёт данных по строкам, подход SUM(CASE WHEN...) идеально подойдёт:

SQL
Скопировать код
SELECT UserID,
       SUM(CASE WHEN имя = 'system' THEN 1 END) AS КоличествоСистемныхЗаписей,
       COUNT(*) AS ОбщееКоличествоЗаписейПользователя
FROM ПримерТаблицы
GROUP BY UserID;
/* "Нет ничего лучше проверенной системы!" */

На выходе вы получите подробную статистику по числу записей с имя 'system', а также общее число записей для каждого пользователя.

Альтернативный подход к подсчёту с использованием IIF

В качестве альтернативы можно использовать функцию IIF в SQL Server для упрощения логики запроса:

SQL
Скопировать код
SELECT UserID,
       SUM(IIF(имя = 'system', 1, 0)) AS КоличествоСистемныхЗаписей,
       COUNT(*) AS ОбщееКоличествоЗаписей
FROM ПримерТаблицы
GROUP BY UserID;
/* "Если есть 'system', мы его подсчитаем!" */

Такая запись более понятна, в особенности, если вы уже имеете опыт работы с условными функциями.

Важность группировки

Группировка необходима для разделения подсчётов, например, по UserID. Она поможет корректно приписывать результаты каждому пользователю и визуализирует распределение по категориям.

Визуализация

Представим такую ситуацию: повар готовит блюдо и проверяет свежесть ингредиентов:

SQL
Скопировать код
SELECT 
    НазваниеБлюда,
    COUNT(CASE WHEN Свежий = 1 THEN 1 END) as СвежиеИнгредиенты,
    COUNT(CASE WHEN Свежий = 0 THEN 1 END) as НесвежиеИнгредиенты
FROM 
    Кухня
GROUP BY 
    НазваниеБлюда;

Ингредиенты с меткой 🥒 = 1 считаются свежими, те что с меткой 🥀 = 0 — несвежими.

Markdown
Скопировать код
| НазваниеБлюда    | 🥒 СвежиеИнгредиенты | 🥀 НесвежиеИнгредиенты |
| ---------------- | -------------------- | --------------------- |
| Салат "Садовый"  | 5                    | 0                     |
| Овощной Строганов| 3                    | 2                     |
| Сытное Рагу      | 2                    | 3                     |

Таким образом, мы видим соотношение свежих и несвежих ингредиентов для каждого блюда, что аналогично анализу записей типа 'system'.

Учет нескольких условий

Если подсчёт должен учитывать разные условия, запрос можно дополнить:

SQL
Скопировать код
SELECT UserID,
       SUM(CASE WHEN имя = 'system' THEN 1 ELSE 0 END) AS СчетчикСистемных,
       SUM(CASE WHEN статус = 'active' THEN 1 ELSE 0 END) AS СчетчикАктивных,
       COUNT(*) AS ОбщееКоличествоЗаписей
FROM ПримерТаблицы
GROUP BY UserID;
/* "Подсчёт для 'system' и 'active' — вместе!" */

Такой запрос выдаст подробную информацию о количестве записей типа 'system' и записей со статусом 'active'.

Сверка с ожидаемыми результатами

После выполнения запроса сравните полученные данные с ожидаемыми результатами или известными вам значениями, чтобы убедиться в правильности вычислений.

Настройка запроса под ваши требования

Замените в запросе UserID,имя,статус и ПримерТаблицы на реальные имена столбцов и таблиц в вашей базе данных.

Избегание типичных ошибок

Чтобы избегать ошибок при работе с SQL, следует быть внимательными к синтаксису запросов, правильно использовать выражения GROUP BY и логические условия.

Эффективное использование функций

Выбор между SUM(CASE WHEN...), IIF и COUNT(*) может повлиять на оптимизацию запросов и производительность вашей базы данных.

Полезные материалы

  1. Маппинг существующих таблиц на иерархию наследования в NHibernate – Stack Overflow — Примеры использования SQL CASE на Stack Overflow.
  2. Функции SQL COUNT(), AVG() и SUM() – W3Schools — подробное руководство по агрегатным функциям в SQL.
  3. COUNT (Transact-SQL) – SQL Server | Microsoft Learn — Официальная документация Microsoft по функции COUNT в SQL Server.
  4. Функция COUNT в SQL Server – SQL Server Tutorial — Учебное пособие с примерами использования функции COUNT в SQL Server.