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

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

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

O que eu tenho até agora é:

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

Isso me deixa no meio do caminho, mas está contando todos os nomes dos programas, não os distintos (o que eu não esperava que fizesse naquela consulta). Eu acho que eu simplesmente não consigo entender como contar apenas os nomes dos programas distintos sem selecioná-los. Ou alguma coisa.

Conte todos os nomes dos 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ê quer é COUNT ( expressão DISTINCT) : avalia a expressão para cada linha de um grupo e retorna o número de valores únicos e não nulos.

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 acabei com 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 

Você precisa criar uma tabela temporária 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 dt é uma tabela temporária

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 
 SELECT COUNT(DISTINCT program_name) AS Count, program_type AS [Type] FROM cm_production WHERE push_number=@push_number GROUP BY program_type 

Este é um bom exemplo onde você deseja obter a contagem de Pincode que armazenou 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) 
 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