2009-10-05 6 views
279

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 nom_programme et push_number avec quelques autres colonnes.Requête SQL Server - Sélection de COUNT (*) avec DISTINCT

BUT: comptez le nombre de noms de programme DISTINCTS par type de programme et pousser le numéro

Ce que j'ai à ce jour est:

SELECT DISTINCT COUNT(*) AS Count, program_type AS [Type] 
FROM cm_production 
WHERE [email protected]_number 
GROUP BY program_type 

Ce me fait une partie du chemin, mais qu'il compte tous les noms de programme, pas les distincts (ce que je ne m'attends pas à faire dans cette requête). Je suppose que je ne peux tout simplement pas comprendre comment compter uniquement les noms de programmes distincts sans les sélectionner. Ou quelque chose.

Répondre

478

Compter tous les noms de programme DISTINCTS par type de programme et pousser le numéro

SELECT COUNT(DISTINCT program_name) AS Count, 
    program_type AS [Type] 
FROM cm_production 
WHERE [email protected]_number 
GROUP BY program_type 

COUNT DISTINCT (*) retourne une ligne pour chaque unique, compter. 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, non nulles.

+4

Merci. J'ai du mal à conceptualiser les requêtes SQL pour une raison quelconque. Cela fonctionne parfaitement. – somacore

+4

Comment puis-je obtenir le COUNT des DISTINCT en fonction de plus d'une colonne? J'ai essayé de faire SELECT COUNT (DISTINCT col1, col2) ', mais' COUNT' semble interpréter cela comme un mauvais nombre d'arguments. –

+3

@Bepetersn: Je vous suggère de poser une question distincte –

13

essayez ceci:

SELECT 
    COUNT(program_name) AS [Count],program_type AS [Type] 
    FROM (SELECT DISTINCT program_name,program_type 
       FROM cm_production 
       WHERE [email protected]_number 
     ) dt 
    GROUP BY program_type 
11
SELECT COUNT(DISTINCT program_name) AS Count, program_type AS [Type] 
FROM cm_production 
WHERE [email protected]_number 
GROUP BY program_type 
64

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

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

Ce qui me donnerait une liste comme, par exemple:

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

Dans postgresql, vous pouvez utiliser 'count (*)' plutôt que 'count (*) AS count'. – ogirginc

+0

hey @ Netsi1964 même requête est utilisée mais je veux Région, État, compte, il peut être possible? S'il vous plaît aidez-moi –

18

Vous devez créer une table temporaire pour les colonnes distinctes et interroger la compter de cette table

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

ici dt est une table temporaire

+0

Merci! 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 "comme X". – Mmm

+2

Notez que la terminologie normale pour "dt" ici est la table _derived_, pas la table temporaire – 8forty

-5
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 
-1

Ceci est un bon exemple où vous voulez obtenir le nombre de Pincode qui stocké 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) 
Questions connexes