2009-03-20 20 views
24

Tengo un problema con una consulta en Oracle SQL.grupo por el primer carácter

Tengo una columna first_name en una tabla employees. Quiero agrupar mis registros de acuerdo con el primer personaje en first_name.

Por ejemplo, tengo 26 registros, uno con name = 'Alice', uno con name = 'Bob', y así sucesivamente hasta el primer carácter de cada nombre. Después de la consulta, debe haber 26 grupos con un empleado cada uno.

He intentado lo siguiente, pero no está funcionando:

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

Consulte el siguiente enlace a una pregunta similar para SQL Serv er: http://stackoverflow.com/questions/13500638/sql-how-many-records-start-with-the-same-letter –

Respuesta

52

Su consulta es incorrecta, ya que tendría que realizar alguna función de agregación en EMPLOYEE_ID si desea que al trabajo.

igual:

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

¿Qué es exactamente lo que está tratando de lograr?

+1

Me ganaste, limpio y cuadrado. Casi idéntica consulta también. – yukondude

+1

Hehehehehe ... Yah. Yo te voté de todos modos ;-) –

+0

muchas gracias. Obtuve mi resultado ... te doy muchas ganas –

6

Deberá agrupar por todo lo que no sea una función de agregado, por lo que no puede tener employee_id en la proyección SELECT. También necesita agrupar solo el primer carácter del primer nombre. Algo como esto debería funcionar:

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

que agrupara por la primera letra del nombre de pila, y mostrar el número de empleados que caen dentro de ese grupo.

1

Al agrupar, todas las columnas que aparecen en su lista de selección que no están agregadas también deben aparecer en la cláusula "agrupar por" (employee_id no).

¿Podría aclarar qué es lo que está tratando de hacer?

0

Creo que sé lo que está tratando de hacer ...

Debe crear una pequeña tabla de referencia con una columna 'letra' (carta, sort_order)

Usted debe su consulta lo

seleccione l.letter, count (e.id) como empleados de letra l externa izquierda electrónico del empleado en l.letter = substr (e.first_name, 1,1)

la otra respuesta publicado dará Eres inesperado resultados cuando no hay empleados con una letra específica en su nombre ...

+0

muchas gracias. Obtuve mi resultado ... les agradezco muchísimo –

2

Casi parece que quiere 26 registros devueltos con A, B, C como la primera columna y luego una segunda columna que contiene todas las ID de empleados en una lista delimitada. Si es así, consulte la pregunta 468990 y/o this Ask Tom link.Algo así como (no probado)

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

muchas gracias. Obtuve mi resultado ... muchas gracias –

0

En Rieles/postgres que podría ser algo como esto

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

tengo problema similar y lo resolvió esto con la declaración:

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

output

Cuestiones relacionadas