按第一个字符分组

时间:2009-03-20 15:01:29

标签: sql group-by aggregate-functions

我在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 个答案:

答案 0 :(得分:57)

您的查询错误,因为如果您希望这样做,您需要在EMPLOYEE_ID上执行一些聚合功能。

像:

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

你究竟想要完成什么?

答案 1 :(得分:8)

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

几乎听起来你想要26条记录,其中A,B,C作为第一列,然后是第二列,其中包含分隔列表中的所有员工ID。如果是,请参阅问题468990和/或this Ask Tom link。像(未经测试的)

之类的东西
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);

答案 3 :(得分:1)

在进行分组时,选择列表中显示的所有未汇总的列也必须出现在“group by”子句中(employee_id不会)。

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:1)

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

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

output

答案 6 :(得分:0)

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

您应该创建一个带有'letter'(letter,sort_order)列的小型参考表

您的查询应该是

选择l.letter,count(e.id)作为员工 来自信件l 左外连接员工e在l.letter = substr(e.first_name,1,1)

如果没有员工姓名中有特定字母,那么发布的其他答案会给您带来意想不到的结果......