2010-12-20 2 views
3

Je ne suis pas certain comment structurer une requête SQL pour retourner le nombre de lignes où une colonne est égale à certaines valeurs.sql restriction count count

Par exemple,

Dans le tableau myTable, comment puis-je retourner le compte de toutes les lignes où myColumn = "xyz" et où myColumn = "abc"? Est-ce possible avec une seule requête?

Pour clarifier les choses, dire qu'il ya 10 lignes où myColumn = "xyx" et 7 lignes où myColumn = "abc", la requête retourne quelque chose comme:

firstCountResult: 10 
secondCountResult: 7 

Répondre

3

Que diriez-vous ?:

SELECT 
    COUNT(*), 
    myColumn 
FROM myTable 
WHERE myColumn IN ('xyz', 'abc') 
GROUP BY myColumn 

Cette approche fonctionne aussi avec d'autres fonctions d'agrégat comme MIN, MAX, AVG, SUM ... Vous obtenez le résultat agrégé par la valeur de la colonne groupée par rapport à toutes les lignes.

--min myDate per myColumn value 
SELECT 
    MIN(myDate), 
    myColumn 
FROM myTable 
WHERE myColumn IN ('xyz', 'abc') 
GROUP BY myColumn 

--sum of myNumericCol per myColumn value 
SELECT 
    SUM(myNumericCol), 
    myColumn 
FROM myTable 
WHERE myColumn IN ('xyz', 'abc') 
GROUP BY myColumn 
+0

Ne faites jamais COUNT (*), compter (1) ou compter (colonne dans un index utilisé non nulle) est mieux. – stjohnroe

+0

Hmmm. La différence entre count (*) et count (1) peut ne pas être ce que vous attendez: [Ask Tom discussion] (http://asktom.oracle.com/pls/asktom/f?p=100:11:0 :: :: P11_QUESTION_ID: 1156151916789), [oracledba.co.uk] (http://www.oracledba.co.uk/tips/count_speed.htm). Je suppose qu'une colonne indexée non nulle peut avoir du sens, mais je n'en ai pas eu une disponible. –

+0

@stjohnroe, le compte (*) est identique au compte (1). –

2

Vous voulez grouper le compte par mycolumn si vous le faites

select 
     myColumn, count(*) 
from 
     myTable 
where 
     myColumn in ('xyz','abc') 
group by 
     myColumn