Выбор COUNT(*) с DISTINCT
У меня есть проблема с запросом в SQL Server 2005. У меня есть таблица cm_production
, в которой перечислены все коды, которые были выставлены в продакшен. Таблица содержит столбцы ticket_number
, program_type
, program_name
и push_number
, а также несколько других столбцов.
ЦЕЛЬ: Посчитать все DISTINCT имена программ по типу программы и номеру пуша.
Вот что у меня есть на данный момент:
DECLARE @push_number INT;
SET @push_number = [HERE_ADD_NUMBER];
SELECT DISTINCT COUNT(*) AS Count, program_type AS [Type]
FROM cm_production
WHERE push_number=@push_number
GROUP BY program_type
Однако этот запрос возвращает общее количество, не учитывая DISTINCT имена программ, что, как я понимаю, не должно происходить в этом запросе. Я не могу понять, как заставить его считать только DISTINCT имена программ, не выбирая их напрямую. Может, есть что-то, что я упускаю?
5 ответ(ов)
Для получения количества вхождений каждого уникального значения в столбце, содержащем информацию о регионах, я использовал следующий простой SQL-запрос:
SELECT Region, count(*)
FROM item
WHERE Region is not null
GROUP BY Region
Этот запрос возвратит список, например, в следующем формате:
Region, count
Дания, 4
Швеция, 1
США, 10
Таким образом, вы получите количество записей для каждого региона, игнорируя нулевые значения.
Вам нужно создать производную таблицу с уникальными значениями столбцов, а затем выполнить запрос на подсчет из этой таблицы:
SELECT COUNT(*)
FROM (SELECT DISTINCT column1, column2
FROM tablename
WHERE condition) AS dt
Где dt
— это производная таблица.
В приведенном вами SQL-запросе выполняется подсчет уникальных названий программ (program_name) для определенного номера пуша (push_number), сгруппированных по типу программ (program_type).
Запрос:
SELECT COUNT(DISTINCT program_name) AS Count, program_type AS [Type]
FROM cm_production
WHERE push_number=@push_number
GROUP BY program_type
- COUNT(DISTINCT program_name): Эта часть подсчитывает количество уникальных наименований программ в наборах данных, которые соответствуют указанному номеру пуша.
- FROM cm_production: Данные извлекаются из таблицы
cm_production
. - WHERE push_number=@push_number: Условие фильтрует записи, оставляя только те, которые имеют указанный номер пуша (параметр
@push_number
). - GROUP BY program_type: Результаты агрегируются по типу программы, что означает, что для каждого уникального значения
program_type
будет возвращено количество уникальных наименований программ.
В результате выполнения этого запроса вы получите таблицу с двумя колонками: Count
, которая показывает количество уникальных названий программ для каждого типа, и Type
, которая указывает на соответствующий тип программы.
В вашем SQL-запросе вы пытаетесь посчитать количество уникальных названий программ, сгруппированных по типу программы, для определённого push_number
. Ваш запрос можно немного упростить и сделать более читабельным. Попробуйте следующий вариант:
SELECT
COUNT(DISTINCT program_name) AS [Count],
program_type AS [Type]
FROM
cm_production
WHERE
push_number = @push_number
GROUP BY
program_type
В этом запросе мы используем COUNT(DISTINCT program_name)
непосредственно в основном запросе, что делает его более эффективным и понятным. Мы по-прежнему группируем результаты по program_type
, чтобы получить количество уникальных программ для каждого типа. Убедитесь, что параметр @push_number
правильно передан в запрос.
Вы можете попробовать следующий запрос:
SELECT column1, COUNT(*) AS Count
FROM tablename
WHERE createddate >= '2022-07-01'::date
GROUP BY column1;
Данный запрос выбирает значения из column1
и считает количество записей для каждой группы, у которых дата создания (createddate
) больше или равна 1 июля 2022 года. Не забудьте заменить tablename
на название вашей таблицы.
"Вставка результатов хранимой процедуры в временную таблицу"
Как выполнить оператор UPDATE с JOIN в SQL Server?
Запрос UPDATE в SQL с использованием JOINов
Как экранировать одинарную кавычку в SQL Server?
Следует ли мне использовать != или <> для обозначения "не равно" в T-SQL?