Query di SQL Server: selezione di COUNT (*) con DISTINCT


431

In SQL Server 2005 ho una tabella cm_production che elenca tutto il codice che è stato messo in produzione. La tabella ha un ticket_number, program_type e program_name e push_number insieme ad alcune altre colonne.

OBIETTIVO: contare tutti i nomi dei programmi DISTINCT per tipo di programma e numero push

Quello che ho finora è:

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

Questo mi porta a metà strada lì, ma sta contando tutti i nomi dei programmi, non quelli distinti (che non mi aspetto che faccia in quella query). Immagino di non riuscire a capire come dirgli di contare solo i nomi distinti del programma senza selezionarli. O qualcosa.

Risposte:


729

Contare tutti i nomi dei programmi DISTINCT per tipo di programma e premere il numero

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(*)restituirà una riga per ogni conteggio univoco. Quello che vuoi è COUNT(DISTINCT <expression>): valuta l'espressione per ogni riga in un gruppo e restituisce il numero di valori univoci e non nulli.


110

Avevo bisogno di ottenere il numero di occorrenze di ciascun valore distinto. La colonna conteneva informazioni sulla regione. La semplice query SQL che ho concluso è stata:

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

Il che mi darebbe un elenco come, diciamo:

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

hey @ Netsi1964 viene utilizzata la stessa query ma desidero Region, State, Count, può essere possibile? Per favore aiutatemi

48

Devi creare una tabella derivata per le colonne distinte e quindi interrogare il conteggio da quella tabella:

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

Ecco dtuna tabella derivata.


1
Grazie! Ho usato molto SQL nella mia vita in molti database, e questa è la prima volta che ho dovuto qualificarlo come tabella temporanea con "come X".
Mmm,

6
Si noti che la terminologia normale per "dt" qui è tabella derivata , non tabella temporanea
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

prova questo:

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

Questo è un buon esempio in cui si desidera ottenere il conteggio del codice PIN memorizzato nell'ultimo campo dell'indirizzo

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.