web-dev-qa-db-de.com

gruppieren Sie nach dem ersten Zeichen

Ich habe ein Problem mit einer Abfrage in Oracle SQL.

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 im Alphabet für das erste Zeichen jedes Namens. Nach der Abfrage sollten 26 Gruppen mit jeweils einem Mitarbeiter vorhanden sein.

Ich habe folgendes versucht, 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  
29
sonu

Ihre Abfrage ist falsch, da Sie unter EMPLOYEE_ID eine Aggregationsfunktion ausführen müssen, wenn dies funktionieren soll.

Mögen:

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

Was genau willst du erreichen?

57

Sie müssen nach allem gruppieren, bei dem es sich nicht um eine Aggregatfunktion handelt. Daher können Sie employee_id nicht in der SELECT-Projektion verwenden. Sie müssen auch nur nach dem ersten Zeichen des Vornamens 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);

Dies würde sich nach dem ersten Buchstaben des Vornamens gruppieren und die Anzahl der Angestellten anzeigen, die in diese Gruppe fallen.

8
yukondude

Es klingt fast so, als wollten Sie 26 Datensätze zurückgeben, wobei A, B, C als erste Spalte und dann eine zweite Spalte mit allen Mitarbeiter-IDs in einer begrenzten Liste angezeigt wird. Wenn ja, siehe Frage 468990 und/oder diesen Ask Tom-Link . Etwas wie (ungeprüft)

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);
2
Alistair Knock

Ich habe ein ähnliches Problem und dieses Problem mit der Aussage gelöst:

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

output

1
user3418801

Wenn Sie gruppieren, müssen alle Spalten, die in Ihrer Auswahlliste angezeigt werden und nicht aggregiert sind, auch in der Klausel "Gruppieren nach" (Employee_id nicht) angezeigt werden.

Könnten Sie erklären, was Sie zu tun versuchen?

1
Joe Suarez

In Rails/Postgres könnte das ungefähr so ​​aussehen

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

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

Sie sollten eine kleine Referenztabelle mit einer Spalte 'letter' (letter, sort_order) erstellen.

Du solltest deine Anfrage als

wähle l.letter, count (e.id) als Angestellte aus Buchstabe l linker äußerer Join-Mitarbeiter e auf l.letter = substr (e.first_name, 1,1)

die andere Antwort liefert unerwartete Ergebnisse, wenn es keine Mitarbeiter mit einem bestimmten Buchstaben im Namen gibt ...

0
mson