2009-03-20 14 views
24

Ho un problema con una query in Oracle SQL.gruppo per primo carattere

Ho una colonna first_name in una tabella employees. Voglio raggruppare i miei record in base al primo carattere in first_name.

Ad esempio, ho 26 record, uno con name = 'Alice', uno con name = 'Bob' e così via in basso l'alfabeto per il primo carattere di ciascun nome. Dopo la query, dovrebbero esserci 26 gruppi con un dipendente ciascuno.

Ho provato quanto segue, ma non funziona:

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

Vedere il collegamento seguente a una domanda simile per SQL Serv e: http://stackoverflow.com/questions/13500638/sql-how-many-records-start-with-the-same-letter –

risposta

52

Vostri criteri è sbagliato, in quanto si avrebbe bisogno di eseguire alcune funzione di aggregazione su EMPLOYEE_ID se si desidera che al lavoro.

come:

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

che cosa esattamente si sta cercando di realizzare?

+1

Mi hai battuto su di esso, equo e quadrato. Anche query quasi identiche. – yukondude

+1

Hehehehehe ... Yah. Ti ho votato comunque ;-) –

+0

grazie mille. ho ottenuto il mio risultato ... anche tu molto –

6

È necessario raggruppare in base a tutto ciò che non è una funzione di aggregazione, quindi non è possibile avere employee_id nella proiezione SELECT. È inoltre necessario raggruppare solo il primo carattere del first_name. Qualcosa del genere dovrebbe funzionare:

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

Che farebbe gruppo dalla prima lettera del nome di battesimo, e visualizza il numero di dipendenti che rientrano in quel gruppo.

1

Quando si raggruppa, tutte le colonne visualizzate nell'elenco di selezione che non sono aggregate devono apparire anche nella clausola "gruppo per" (ID dipendente no).

Puoi chiarire che cosa stai cercando di fare?

0

Credo di sapere cosa si sta cercando di fare ...

Si dovrebbe creare una tabella di riferimento piccolo con una colonna 'lettera' (lettera, sort_order)

Si dovrebbe la query come

selezionare l.letter, count (e.id) come dipendenti dalla lettera l join esterno sinistro dipendente e sulla l.letter = substr (e.first_name, 1,1)

l'altra risposta postato darà sei inaspettato risultati quando non ci sono dipendenti con una lettera specifica nel loro nome ...

+0

grazie mille. ho ottenuto il mio risultato ... grazie mille –

2

Sembra quasi che si desideri 26 record restituiti con A, B, C come prima colonna e quindi una seconda colonna contenente tutti gli ID dipendenti in una lista delimitata. Se è così, vedi domanda 468990 e/o this Ask Tom link.Qualcosa di simile (non testata)

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

grazie mille. ho ottenuto il mio risultato ... grazie mille –

0

in Rails/postgres che potrebbe assomigliare a questo

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

ho problema simile e risolto questo con la dichiarazione:

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

output

Problemi correlati