Запрос SQL Server - выбор COUNT (*) с помощью DISTINCT


431

В SQL Server 2005 у меня есть таблица cm_production, которая перечисляет весь код, который был запущен в производство. В таблице есть тикетный номер, номер_программы, а также имя_программы и номер_толбца вместе с некоторыми другими столбцами.

ЦЕЛЬ: Подсчитать все имена программ DISTINCT по типу программы и номеру push

То, что я до сих пор это:

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

Это приводит меня к тому, что я на полпути, но подсчитываю все имена программ, а не отдельные (чего я не ожидаю в этом запросе). Думаю, я просто не могу понять, как сказать, что нужно считать только разные названия программ, не выбирая их. Или что-то.

Ответы:


729

Подсчитать все имена программ DISTINCT по типу программы и номеру push

SELECT COUNT(DISTINCT program_name) AS Count,
  program_type AS [Type] 
FROM cm_production 
WHERE push_number=@push_number 
GROUP BY program_type

DISTINCT COUNT(*)вернет строку для каждого уникального числа. Что вы хотите COUNT(DISTINCT <expression>): вычисляет выражение для каждой строки в группе и возвращает количество уникальных ненулевых значений.


110

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

SELECT Region, count(*)
FROM item
WHERE Region is not null
GROUP BY Region

Который дал бы мне список вроде, скажем:

Region, count
Denmark, 4
Sweden, 1
USA, 10

эй @ Netsi1964 используется тот же запрос, но я хочу регион, штат, граф, это возможно? Пожалуйста, помогите мне

48

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

SELECT COUNT(*) 
FROM (SELECT DISTINCT column1,column2
      FROM  tablename  
      WHERE condition ) as dt

Вот dtпроизводная таблица.


1
Спасибо! Я использовал много SQL в своей жизни во многих базах данных, и мне впервые пришлось квалифицировать его как временную таблицу с «как X».
Ммм

6
Обратите внимание, что обычная терминология для «dt» здесь - производная таблица, а не временная таблица
8forty

17
SELECT COUNT(DISTINCT program_name) AS Count, program_type AS [Type] 
FROM cm_production 
WHERE push_number=@push_number 
GROUP BY program_type

15

попробуй это:

SELECT
    COUNT(program_name) AS [Count],program_type AS [Type]
    FROM (SELECT DISTINCT program_name,program_type
              FROM cm_production 
              WHERE push_number=@push_number
         ) dt
    GROUP BY program_type

-1

Это хороший пример, где вы хотите получить счетчик Pin-кода, который хранится в последнем поле адреса

SELECT DISTINCT
    RIGHT (address, 6),
    count(*) AS count
FROM
    datafile
WHERE
    address IS NOT NULL
GROUP BY
    RIGHT (address, 6)

-6
select  count (distinct NumTar),'PROPIAS'
from ATM_TRANe with (nolock)
where Fecha>='2014-01-01'
  AND Fecha<='2015-05-31'and NetDestino=0
  and SystemCodResp=0
group by NetDestino 
union 
select sum (contar),'FORANEAS'
from  
(
  select  count(distinct NumTar) as contar
  from ATM_TRANe with (nolock)
  where Fecha>='2014-01-01'
    AND Fecha<='2014-01-31'
    and NetDestino!=0
    and SystemCodResp=0
  group by NetDestino
)dt
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.