Requête SQL Server - Sélection de COUNT (*) avec DISTINCT

431

Dans SQL Server 2005, j'ai une table cm_production qui répertorie tout le code qui a été mis en production. La table a un ticket_number, program_type et program_name et push_number avec quelques autres colonnes.

OBJECTIF: Compter tous les noms de programmes DISTINCT par type de programme et numéro de push

Ce que j'ai jusqu'à présent, c'est:

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

Cela m'amène à mi-chemin, mais il compte tous les noms de programme, pas les noms distincts (ce que je ne m'attends pas à ce qu'il fasse dans cette requête). Je suppose que je ne peux pas comprendre comment lui dire de ne compter que les noms de programme distincts sans les sélectionner. Ou quelque chose.

somacore
la source

Réponses:

729

Compter tous les noms de programmes DISTINCT par type de programme et numéro de 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(*)renverra une ligne pour chaque comptage unique. Ce que vous voulez, c'est COUNT(DISTINCT <expression>): évalue l'expression pour chaque ligne d'un groupe et retourne le nombre de valeurs uniques et non nulles.

Remus Rusanu
la source
110

J'avais besoin d'obtenir le nombre d'occurrences de chaque valeur distincte. La colonne contenait des informations sur la région. La simple requête SQL avec laquelle j'ai fini était:

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

Ce qui me donnerait une liste comme, disons:

Region, count
Denmark, 4
Sweden, 1
USA, 10
Netsi1964
la source
hey @ Netsi1964 la même requête est utilisée mais je veux la région, l'état, le nombre, cela peut être possible? Aidez-moi s'il vous plaît
48

Vous devez créer une table dérivée pour les colonnes distinctes, puis interroger le nombre de cette table:

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

Voici dtun tableau dérivé.

venkatesh
la source
1
Je vous remercie! J'ai utilisé beaucoup de SQL dans ma vie à travers de nombreuses bases de données, et c'est la première fois que je devais le qualifier de table temporaire avec "as X".
Mmm
6
Notez que la terminologie normale pour "dt" ici est une table dérivée , pas une table temporaire
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
van
la source
15

essaye ça:

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.
la source
-1

Ceci est un bon exemple où vous souhaitez obtenir le nombre de codes PIN stockés dans le dernier champ d'adresse

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