группировать по первому символу - PullRequest
33 голосов
/ 20 марта 2009

У меня проблема с запросом в Oracle SQL.

У меня есть столбец first_name в таблице employees. Я хочу сгруппировать свои записи по первому символу в first_name.

Например, у меня 26 записей, одна с name = 'Alice', одна с name = 'Bob' и так далее по алфавиту для каждого первого символа имени. После запроса должно быть 26 групп с одним сотрудником в каждой.

Я попробовал следующее, но оно не работает:

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  

Ответы [ 7 ]

57 голосов
/ 20 марта 2009

Ваш запрос неверен, поскольку вам нужно выполнить некоторую функцию агрегирования EMPLOYEE_ID, если вы хотите, чтобы это работало.

Как:

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

Что именно вы пытаетесь достичь?

8 голосов
/ 20 марта 2009

Вам нужно сгруппировать все, что не является агрегатной функцией, поэтому в проекции SELECT не может быть employee_id. Вам также нужно сгруппировать по первому символу first_name. Примерно так должно работать:

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

Это сгруппировало бы первую букву имени и показывало бы количество сотрудников, попадающих в эту группу.

2 голосов
/ 20 марта 2009

Похоже, вы хотите, чтобы 26 записей возвращались с A, B, C в качестве первого столбца, а затем со вторым столбцом, содержащим все идентификаторы сотрудников в списке с разделителями. Если это так, см. Вопрос 468990 и / или по этой ссылке Ask Tom . Что-то вроде (не проверено)

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);
1 голос
/ 28 января 2016

У меня похожая проблема, и я решил ее с помощью заявления:

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

output

1 голос
/ 20 июля 2015

В Rails / postgres это может выглядеть примерно так

group_clause = 'UPPER(LEFT(name, 1))'
Division.group(group_clause).order(group_clause).pluck(group_clause, 'COUNT(id)')
1 голос
/ 20 марта 2009

Когда вы группируете, все столбцы, которые появляются в вашем списке выбора, которые не агрегированы, также должны появляться в предложении «group by» (employee_id нет).

Не могли бы вы уточнить, что вы пытаетесь сделать?

0 голосов
/ 20 марта 2009

Мне кажется, я знаю, что вы пытаетесь сделать ...

Вы должны создать небольшую справочную таблицу с колонкой 'letter' (letter, sort_order)

Вы должны ваш запрос как

выберите l.letter, count (e.id) в качестве сотрудников из письма л оставил сотрудника внешнего объединения e на l.letter = substr (e.first_name, 1,1)

другой опубликованный ответ даст вам неожиданные результаты, когда нет сотрудников с конкретными буквами в названии ...

...