Consulta do SQL Server - Selecionando COUNT (*) com DISTINCT

431

No SQL Server 2005, tenho uma tabela cm_production que lista todo o código que foi colocado em produção. A tabela possui um ticket_number, program_type e program_name e push_number junto com algumas outras colunas.

META: conte todos os nomes de programas DISTINCT por tipo de programa e número de envio

O que tenho até agora é:

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

Isso me leva a meio caminho, mas conta todos os nomes de programas, não os distintos (o que não espero que seja feito nessa consulta). Acho que simplesmente não consigo entender como dizer para contar apenas os nomes distintos dos programas sem selecioná-los. Ou alguma coisa.

somacore
fonte

Respostas:

729

Conte todos os nomes de programas DISTINCT por tipo de programa e número de envio

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(*)retornará uma linha para cada contagem exclusiva. O que você deseja é COUNT(DISTINCT <expression>): avalia a expressão para cada linha em um grupo e retorna o número de valores únicos e não nulos.

Remus Rusanu
fonte
110

Eu precisava obter o número de ocorrências de cada valor distinto. A coluna continha informações da região. A consulta SQL simples que eu terminei foi:

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

O que me daria uma lista como, digamos:

Region, count
Denmark, 4
Sweden, 1
USA, 10
Netsi1964
fonte
hey @ Netsi1964 mesma consulta é usada, mas eu quero Região, Estado, Contagem, isso pode ser possível? Por favor me ajude
48

Você deve criar uma tabela derivada para as colunas distintas e, em seguida, consultar a contagem dessa tabela:

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

Aqui dtestá uma tabela derivada.

Venkatesh
fonte
1
Obrigado! Eu usei muito SQL na minha vida em muitos bancos de dados, e esta é a primeira vez que eu o qualifico como uma tabela temporária com "como X".
Mmm
6
Observe que a terminologia normal para "dt" aqui é tabela derivada , não tabela temporária
8forty 02/02/19
17
SELECT COUNT(DISTINCT program_name) AS Count, program_type AS [Type] 
FROM cm_production 
WHERE push_number=@push_number 
GROUP BY program_type
furgão
fonte
15

tente isto:

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
KM.
fonte
-1

Este é um bom exemplo de onde você deseja obter a contagem do código de código que foi armazenado no último campo de endereço

SELECT DISTINCT
    RIGHT (address, 6),
    count(*) AS count
FROM
    datafile
WHERE
    address IS NOT NULL
GROUP BY
    RIGHT (address, 6)
Uday Phadke
fonte
-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
Taryn
fonte