2009-07-31 14 views
2

Stellen Sie sich vor ich eine DB-Tabelle von Kunden enthalten, haben {id, Benutzername, Vorname, Nachname}SQL - WO AGGREGATE> 1

Wenn ich finden wollen, wie viele Instanzen gibt verschiedene Vornamen sind, kann ich tun:

select firstname,count(*) from Customers group by 2 order by 1; 

    username | count(*) 
    =================== 
    bob  | 1 
    jeff  | 2 
    adam  | 5 

Wie schreibe ich die gleiche Abfrage, um nur Vornamen zurückzugeben, die mehr als einmal vorkommen? d. h. im obigen Beispiel geben Sie nur die Zeilen für Jeff und Adam zurück.

+0

Denken Sie daran, _HAVING_ Filter auf Gruppenebene finden Sie unter: http://stackoverflow.com/questions/1130062/what-is-the-execution-sequence-of-group -by-have-and-where-Klausel-in-sql-server/1131076 # 1131076 –

Antwort

9

Sie wollen die having Klausel, etwa so:

select 
    firstname, 
    count(*) 
from Customers 
group by firstname 
having count(*) > 1 
order by 1 
+0

Danke Eric - das funktioniert! –

2

Das ist, was die HAVING-Klausel der Fall ist. Ich bin mir nicht sicher, ob dies in Informix arbeiten, aber geben Sie ihm einen Schuss:

select firstname, count(*) 
from Customers 
group by firstname 
HAVING COUNT(*) > 1 
4

group by 2 order by 1 schrecklich, ich sagen soll. Verwenden Sie richtige Spaltennamen, wenn dies unterstützt wird: Dies verbessert die Lesbarkeit drastisch.

Mit dem im Verstand,

select firstname, count(*) c 
from Customers 
group by firstname 
having count(*) > 1 -- Kudos to Shannon 
order by c; 
+2

Ich weiß nichts über Informix, aber generell sind die Spaltenaliase aus der select-Klausel in der having-Klausel nicht verfügbar, da having früher ausgewertet wurde. –

+0

@Shannon: SQL hört nie auf, mich mit seiner Inkonsequenz zu überraschen. Vielen Dank! –

+0

+1 für 'Gruppe von 2 um 1 ist schrecklich'. Es hätte jedoch auch ein Fehler sein müssen; zumindest sollte der Server gesagt haben: "Muss nach Vornamen gruppieren (nicht-Aggregieren in der Auswahlliste)". –