Как подсчитать уникальные записи с group by в SQL Server

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

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

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

Для подсчёта количества уникальных записей в определённом столбце можно использовать следующий запрос:

SQL
Скопировать код
SELECT COUNT(DISTINCT column_name) FROM table_name;

При использовании данного запроса будет получено число уникальных значений в столбце column_name таблицы table_name, при этом дублирующиеся значения игнорируются.

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

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

Не стоит использовать COUNT(DISTINCT *). DISTINCT предназначен для применения к конкретным столбцам с целью получения точных результатов. В различных ситуациях корректный запрос может выглядеть так:

SQL
Скопировать код
-- До свидания, дубликаты. Здравствуй, точность!
SELECT program_type, COUNT(DISTINCT program_name) AS Count
FROM cm_production
WHERE push_number = @push_number
GROUP BY program_type;

В данном запросе проводится выборка с фильтрацией по push_number, группировкой по program_type и подсчётом уникальных значений program_name.

Чёткость результатов благодаря использованию псевдонимов и фильтрации

Псевдонимы упрощают восприятие результатов запроса: используйте, например, AS Count для подсчитанных уникальных значений или AS [Type] для удобного отображения полей. Применение переменных, таких как @push_number, облегчает фильтрацию:

SQL
Скопировать код
-- Переменные облегчают формулировку запросов. Попробуйте их!
DECLARE @push_number INT = 1234;
SELECT program_type AS [Type], COUNT(DISTINCT program_name) AS Count
FROM cm_production
WHERE push_number = @push_number
GROUP BY program_type
ORDER BY Count DESC, [Type];

В данном запросе результаты сортируются вначале по количеству, затем по типу программы. Приоритет отдаётся информационному содержимому запрашиваемых данных.

Использование подзапросов для повышения точности данных

Применяйте подзапросы или производные таблицы для подсчёта уникальных значений в случае сложных запросов:

SQL
Скопировать код
-- Подзапросы — потому что насчитывание вручную занимает слишком много времени!
SELECT COUNT(*)
FROM (
    SELECT DISTINCT program_name
    FROM cm_production
    WHERE push_number = @push_number
) AS unique_programs;

С помощью этого запроса можно аккуратно подсчитать уникальные program_name, связанные с push_number, используя подзапрос.

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

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

Markdown
Скопировать код
🌳🌳🌲🌲🌴🌴🌴🌲🌳🌲🌴🌲🌳🌲

Нас интересуют только разные виды деревьев:

Markdown
Скопировать код
Различные виды: 🌳, 🌲, 🌴.

Теперь подсчитаем их количество:

Markdown
Скопировать код
Количество различных видов: 3

Именно это и делает COUNT(DISTINCT column) — ищет уникальные значения и количество таких.

SQL
Скопировать код
SELECT COUNT(DISTINCT species) FROM forest;

В нашем SQL-примере лес — это табличные данные, а деревья — отдельные записи.

Устранение значений NULL

Для игнорирования значений NULL в подсчёте используйте условие WHERE column_name IS NOT NULL:

SQL
Скопировать код
SELECT COUNT(DISTINCT column_name) 
FROM table_name
WHERE column_name IS NOT NULL;

Такой подход позволит исключить "фантомные" записи из подсчёта.

Адаптация SQL-скриптов

Для подсчёта уникальных регионов и типов программ вам может пригодиться универсальный SQL-скрипт:

SQL
Скопировать код
-- Конкатенация — ключевой элемент для определения уникальности!
SELECT COUNT(DISTINCT CONCAT(region, program_type)) AS UniqueRegionTypes
FROM cm_production
WHERE push_number = @push_number;

Применяя функцию CONCAT, мы создаём уникальный идентификатор, что позволяет решить задачу.

Совместимость с устаревшими версиями SQL

Если вы работаете в SQL Server 2005, некоторые конструкции могут не поддерживаться. Вместо CONCAT используйте оператор +, а для значений NULL применяйте ISNULL.

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

  1. SQL SELECT DISTINCT Statement — Обзор использования DISTINCT в SQL-запросах.
  2. SQL Aggregate Functions | Intermediate SQL – Mode — Руководство по агрегатным функциям в SQL, включая COUNT.
  3. PostgreSQL: Documentation: 16: SELECT — Описание использования SELECT и DISTINCT в официальной документации PostgreSQL.
  4. What is the difference between select count(*) and select count(any_non_null_column)? — Обсуждение особенностей функции COUNT на сайте Stack Exchange.
  5. Error 404 (Not Found)!!1 — Бывшее подробное руководство по использованию функции COUNT() в SQL Server, в настоящий момент недоступно. Возможно, в скором времени информация будет восстановлена!