2009-03-20 26 views
24

Ich habe ein Problem mit einer Abfrage in Oracle SQL.Gruppe nach dem ersten Zeichen

Ich habe eine first_name Spalte in einer employees Tabelle. Ich möchte meine Datensätze nach dem ersten Zeichen in first_name gruppieren.

Zum Beispiel habe ich 26 Datensätze, einen mit name = 'Alice', einen mit name = 'Bob', und so weiter das Alphabet für jedes erste Zeichen des Namens. Nach der Abfrage sollten 26 Gruppen mit je einem Mitarbeiter vorhanden sein.

habe ich versucht, die folgenden, aber es funktioniert nicht:

SELECT employee_id, (SUBSTR(first_name,1,1)) AS alpha FROM employees 
GROUP BY alpha; 

name_which_starts_from  employees 
A       10 
B       2 
C       4 
D       9 
E       3 
G       3 
H       3 
I       2 
J       16 
K       7 
L       6 
M       6 
N       4 
O       1 
P       6 
R       3 
S       13 
T       4 
V       2 
W       3 
+1

Siehe den folgenden Link zu einer ähnlichen Frage für SQL Serv er: http://stackoverflow.com/questions/13500638/sql-how-many-records-start-with-the-same-letter –

Antwort

52

Ihre Anfrage falsch ist, da Sie einige Aggregationsfunktion auf EMPLOYEE_ID ausführen müssten, wenn Sie die arbeiten wollen.

Like:

select substr(first_name,1,1) as alpha, count(employee_id) 
    from employees 
group by substr(first_name,1,1) 

Was genau Sie versuchen zu erreichen?

+1

Sie schlagen mich, fair und eckig. Fast identische Abfrage auch. – yukondude

+1

Hehehehehe ... Yah. Ich habe dich trotzdem gewählt ;-) –

+0

vielen Dank. Ich habe mein Ergebnis..Thkn Sie sehr viel –

6

Sie müssen nach allem gruppieren, das keine Aggregatfunktion ist, so dass Sie in der SELECT-Projektion nicht employee_id haben können. Sie müssen auch nur nach dem ersten Zeichen von first_name gruppieren. So etwas sollte funktionieren:

SELECT SUBSTR(first_name, 1, 1) AS alpha, COUNT(*) AS employee_count 
FROM employees 
GROUP BY SUBSTR(first_name, 1, 1); 

Das würde Gruppe durch die ersten Buchstaben des Vornamens und zeigt die Anzahl der Mitarbeiter, die in diese Gruppe fallen.

1

Wenn Sie gruppieren, müssen alle Spalten, die in Ihrer Auswahlliste nicht aggregiert sind, auch in der Klausel "group by" (employee_id does) angezeigt werden.

Können Sie klarstellen, was Sie versuchen zu tun?

0

Ich glaube, ich weiß, was Sie zu tun versuchen ...

Sie sollten mit einer Spalte ‚Schreiben‘ (Brief, sort_order)

Sie sollten Ihre Abfrage als

eine kleine Referenztabelle erstellen

wählen l.letter, count (e.id) als Mitarbeiter von Buchstaben l linken Außen Mitarbeiter e auf l.letter = substr (e.first_name, 1,1) veröffentlicht

die andere Antwort beitreten geben du bist unerwartet Ergebnisse, wenn keine Mitarbeiter mit einem bestimmten Buchstaben in ihrem Namen sind ...

+0

vielen Dank. Ich habe mein Ergebnis..Thkn Sie sehr viel –

2

Es klingt fast so, als wollten Sie 26 Datensätze mit A, B, C als erste Spalte und dann eine zweite Spalte mit allen Angestellten-IDs zurückgeben eine Liste mit Trennzeichen Wenn ja, siehe Frage 468990 und/oder this Ask Tom link.So etwas wie (ungetestet)

SELECT SUBSTR(first_name,1,1), TO_STRING(CAST(COLLECT(employee_id) AS ntt_varchar2)) AS empIDs 
FROM employees 
GROUP BY 
SUBSTR(first_name,1,1); 
+0

vielen Dank. Ich habe mein Ergebnis..dnk Sie sehr –

0

In Rails/Postgres, die so etwas wie diese

group_clause = 'UPPER(LEFT(name, 1))' 
Division.group(group_clause).order(group_clause).pluck(group_clause, 'COUNT(id)') 
0

aussehen könnten habe ich ähnliches Problem und löste es dieses mit Aussage:

select SUBSTR(word, 1, 1) as S, count(word) FROM table_words group by S order by S ASC

output

Verwandte Themen