Группа по первому символу
У меня проблема с запросом в 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
Ответы
Ответ 1
Ваш запрос неверен, так как вам нужно будет выполнить некоторую функцию агрегации в EMPLOYEE_ID, если вы хотите, чтобы это сработало.
Как
select substr(first_name,1,1) as alpha, count(employee_id)
from employees
group by substr(first_name,1,1)
Что именно вы пытаетесь выполнить?
Ответ 2
Вам нужно будет группировать все, что не является агрегатной функцией, поэтому вы не можете иметь employee_id в проекции SELECT. Вам также нужно сгруппировать только первым символом first_name. Что-то вроде этого должно работать:
SELECT SUBSTR(first_name, 1, 1) AS alpha, COUNT(*) AS employee_count
FROM employees
GROUP BY SUBSTR(first_name, 1, 1);
Это будет группироваться по первой букве имени и покажет количество сотрудников, попадающих в эту группу.
Ответ 3
Похоже, вы хотите, чтобы 26 записей были возвращены с A, B, C в качестве первого столбца, а затем вторым столбцом, содержащим все идентификаторы сотрудников в списке с разделителями. Если да, см. Вопрос 468990 и/или ссылка Ask Tom. Что-то вроде (untested)
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);
Ответ 4
Когда вы группируете, все столбцы, которые отображаются в вашем списке выбора, которые не агрегированы, также должны отображаться в разделе "group by" (employee_id нет).
Не могли бы вы уточнить, что именно вы пытаетесь сделать?
Ответ 5
Я думаю, что знаю, что вы пытаетесь сделать...
Вам следует создать небольшую справочную таблицу с буквой "letter" (letter, sort_order)
Вы должны указать свой запрос как
выберите l.letter, count (e.id) в качестве сотрудников
из письма l
left external join employee e on l.letter = substr (e.first_name, 1,1)
другой опубликованный ответ даст вам неожиданные результаты, если нет сотрудников с определенным письмом от их имени...
Ответ 6
В Rails/postgres, которые могут выглядеть примерно так:
group_clause = 'UPPER(LEFT(name, 1))'
Division.group(group_clause).order(group_clause).pluck(group_clause, 'COUNT(id)')
Ответ 7
У меня есть аналогичная проблема и решил это с помощью инструкции:
select SUBSTR(word, 1, 1) as S, count(word) FROM table_words group by S order by S ASC
![output]()