40

我对 Oracle SQL 中的查询有疑问。

我在表first_name中有一个列employees。我想根据 中的第一个字符对我的记录进行分组first_name

例如,我有 26 条记录,一条带有name = 'Alice',一条带有name = 'Bob',依此类推,每个名称的第一个字符按字母顺序排列。查询后,应该有 26 个组,每个组有 1 名员工。

我尝试了以下方法,但它不起作用:

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  
4

7 回答 7

69

您的查询是错误的,因为如果您希望 EMPLOYEE_ID 起作用,则需要对 EMPLOYEE_ID 执行一些聚合函数。

喜欢:

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

你到底想要完成什么?

于 2009-03-20T15:03:28.840 回答
12

您需要按不是聚合函数的所有内容进行分组,因此您不能在 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);

这将按名字的第一个字母分组,并显示属于该组的员工数量。

于 2009-03-20T15:05:37.477 回答
7

我有类似的问题,并通过声明解决了这个问题:

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

输出

于 2016-01-28T06:43:04.630 回答
2

听起来您几乎想要返回 26 条记录,其中 A、B、C 作为第一列,然后是第二列,其中包含分隔列表中的所有员工 ID。如果是这样,请参阅问题 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);
于 2009-03-20T15:12:17.057 回答
1

分组时,选择列表中出现的所有未聚合的列也必须出现在“group by”子句中(employee_id 没有)。

你能澄清一下你想要做什么吗?

于 2009-03-20T15:08:47.860 回答
1

在 Rails/postgres 中可能看起来像这样

group_clause = 'UPPER(LEFT(name, 1))'
Division.group(group_clause).order(group_clause).pluck(group_clause, 'COUNT(id)')
于 2015-07-20T11:34:52.100 回答
0

我想我知道你想做什么...

您应该创建一个包含“字母”列的小型参考表(字母,排序顺序)

你应该你的查询为

select l.letter, count(e.id) as employees from letter l left outer join employee e on l.letter = substr(e.first_name, 1,1)

当没有员工姓名中包含特定字母时,发布的另一个答案会给您带来意想不到的结果...

于 2009-03-20T15:11:23.907 回答