2010-12-20 13 views
3

Ich bin mir nicht sicher, wie eine SQL-Abfrage strukturieren, um die Anzahl der Zeilen zurückzugeben, wo eine Spalte bestimmte Werte entspricht.sql eingeschränkte Anzahl Abfrage

Zum Beispiel

In Tabelle myTable, wie kann ich wieder die Anzahl aller Zeilen, in denen myColumn = "xyz" und wo myColumn = "abc"? Ist dies mit einer einzigen Abfrage möglich?

Um zu klären, sagen, es gibt 10 Zeilen, in denen myColumn = "xyx" und 7 Zeilen, in denen myColumn = "abc", die Abfrage so etwas wie zurückkehren würde: mit

firstCountResult: 10 
secondCountResult: 7 

Antwort

3

Wie wäre es ?:

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

Dieser Ansatz funktioniert auch andere Aggregatfunktionen wie MIN, MAX, AVG, SUM ... Sie erhalten das Gesamtergebnis für den gruppierten Wert der Spalte im Vergleich zu allen Zeilen.

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

nie verlassen Sie sich (*), count (1) oder count (Spalte in einem nicht null verwendet Index) besser ist. – stjohnroe

+0

Hmmm. Der Unterschied zwischen count (*) und count (1) ist möglicherweise nicht das, was Sie erwarten: [Ask Tom discussion] (http://asktom.oracle.com/pls/asktom/f?p=100:11:02 :: P11_QUESTION_ID: 1156151916789), [oracledba.co.uk] (http://www.oracledba.co.uk/tips/count_speed.htm). Ich nehme an, dass eine Indexspalte, die nicht Null ist, sinnvoll sein könnte, aber ich hatte keine zur Verfügung. –

+0

@stjohnroe, count (*) ist identisch mit count (1). –

2

Sie wollen die Zählung von mycolumn gruppieren, so dass Sie dies tun

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