Consulta de SQL Server: selección de COUNT (*) con DISTINCT

431

En SQL Server 2005 tengo una tabla cm_production que enumera todo el código que se ha puesto en producción. La tabla tiene un ticket_number, program_type y program_name y push_number junto con algunas otras columnas.

OBJETIVO: contar todos los nombres de programas DISTINCT por tipo de programa y número de inserción

Lo que tengo hasta ahora es:

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

Esto me lleva a la mitad, pero cuenta todos los nombres de los programas, no los distintos (que no espero que haga en esa consulta). Supongo que no puedo entender cómo decirle que cuente solo los nombres de programas distintos sin seleccionarlos. O algo.

somacore
fuente

Respuestas:

729

Cuente todos los nombres de programas DISTINCT por tipo de programa y número de inserción

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(*)devolverá una fila por cada recuento único. Lo que desea es COUNT(DISTINCT <expression>): evalúa la expresión para cada fila de un grupo y devuelve el número de valores únicos y no nulos.

Remus Rusanu
fuente
110

Necesitaba obtener el número de ocurrencias de cada valor distinto. La columna contenía información de la región. La consulta SQL simple con la que terminé fue:

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

Lo que me daría una lista como, por ejemplo:

Region, count
Denmark, 4
Sweden, 1
USA, 10
Netsi1964
fuente
hey @ Netsi1964 se utiliza la misma consulta pero quiero Región, Estado, Cuenta, ¿puede ser posible? Por favor
48

Debe crear una tabla derivada para las distintas columnas y luego consultar el recuento de esa tabla:

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

Aquí dthay una tabla derivada.

venkatesh
fuente
1
¡Gracias! He usado mucho SQL en mi vida en muchas bases de datos, y esta es la primera vez que tengo que calificarlo como una tabla temporal con "como X".
Mmm
66
Tenga en cuenta que la terminología normal para "dt" aquí es tabla derivada , no tabla temporal
8 de
17
SELECT COUNT(DISTINCT program_name) AS Count, program_type AS [Type] 
FROM cm_production 
WHERE push_number=@push_number 
GROUP BY program_type
camioneta
fuente
15

prueba esto:

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.
fuente
-1

Este es un buen ejemplo en el que desea obtener el recuento de Pincode que se almacena en el último campo de dirección

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