【问题标题】:group by first character按第一个字符分组
【发布时间】:2010-10-14 13:41:25
【问题描述】:

我在 Oracle SQL 中的查询有问题。

我在employees 表中有一个first_name 列。我想根据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  

【问题讨论】:

标签: sql group-by aggregate-functions


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      听起来您想要返回 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);
      

      【讨论】:

        【解决方案4】:

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

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

        你的查询应该是

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

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            【解决方案6】:

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

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

            【讨论】:

              【解决方案7】:

              您的查询是错误的,因为您需要对 EMPLOYEE_ID 执行一些聚合函数才能使其工作。

              喜欢:

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

              你到底想完成什么?

              【讨论】:

              • 你打败了我,公平公正。也几乎相同的查询。
              猜你喜欢
              • 2016-09-18
              • 2022-05-22
              • 2020-02-03
              • 2015-03-31
              • 1970-01-01
              • 1970-01-01
              • 2015-07-25
              • 2012-04-04
              • 1970-01-01
              相关资源
              最近更新 更多