【问题标题】:SQL Group By function(column) - Now can't Select that columnSQL Group By function(column) - 现在不能选择该列
【发布时间】:2011-09-02 08:59:54
【问题描述】:

我在 Oracle Express 中使用了 HR 员工模式,我想选择在特定年份聘用的员工。

  SELECT hire_date, 
         COUNT(*)
    FROM employees empl
GROUP BY SUBSTR(hire_date, -4)
ORDER BY empl.hire_date;

hire_date 列的格式为“2011 年 1 月 1 日”,所以我想将它们分组 通过提取最后四个字符。

问题是,我遇到以下错误

ORA-00979: not a GROUP BY expression
00979. 00000 -  "not a GROUP BY expression"
*Cause:    
*Action:
Error at Line: 1 Column: 7

这不可能吗?

【问题讨论】:

  • hire_date 列是日期还是字符类型? 'describe employees' 的输出会告诉你这一点。
  • 为什么在date 列上使用substr()? substr() 用于 varchar 列。如果您需要获取日期的一部分,则应改用to_char()(或提取)。您依赖于隐式数据转换,如果更改语言环境设置,该转换势必会中断。
  • @a_horse_with_no_name 谢谢。这是我第一次使用 Oracle DB,但我已将其放入我的 TODO 列表中。感谢您的意见.. =)

标签: sql oracle aggregate-functions ora-00979


【解决方案1】:

您只能在GROUP BY 查询的SELECT 部分中使用GROUP BY 条件或聚合函数(MIN, MAX, AVG 等)。这有效:

select substr(hire_date,-4), count(*)
from employees empl
group by substr(hire_date,-4)
order by substr(hire_date,-4);

【讨论】:

    【解决方案2】:

    如果您仅按其最后四位数字分组,则无法选择完整的hire_date。想想如果你有两行会发生什么:

    hire_date
    =========
    01/01/2001
    02/02/2001
    

    在您将它们分组时生成的单个行中,hire_date 应该是什么?

    所选的每一列都必须是分组列或聚合列。换句话说,试试:

    select substr(hire_date,-4), count(*)
    from employees
    group by substr(hire_date,-4)
    order by empl.hire_date;
    

    我应该提到每行函数在扩展方面是出了名的糟糕。如果您想大量处理年份,则应考虑将其拆分为自己的列。这可能会大大提高性能,但衡量,不要猜测!

    而且,正如其他人在 cmets 中提到的那样,substr 可能不是最好的解决方案,因为这可能取决于语言环境(例如:日期可能被格式化为 YYYY-MM-DD,这不会顺利substring)。

    最好使用to_char(hire_date,'YYYY')extract (year from hire_date) 之类的东西,它们应该更健壮。

    【讨论】:

    • 而且您还应该提到,在约会时执行 SUBSTR 是一个非常糟糕的主意(正如 a_horse_with_no_name 已经提到的)。 “按提取分组(从租用日期开始的年份)”是要走的路。
    • @Rob,是的,假设它一个日期列。它可能是 char/varchar,这是一个不同的问题:-)
    • 这是一个日期列。这是标准的 HR 架构。
    【解决方案3】:

    如果您希望按使用年雇用的员工分组

    select to_char(hiredate,'yyyy'),count(*) 
    from employee
    group by to_char(hiredate,'yyyy')
    

    【讨论】:

      【解决方案4】:

      你也可以截断hiredate列

      select trunc(hiredate, 'yyyy'), count(*) 
      from employee
      group by trunc(hiredate, 'yyyy')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-13
        • 1970-01-01
        • 2021-01-15
        • 2016-05-26
        • 1970-01-01
        • 2015-03-29
        • 2019-11-11
        • 2021-11-17
        相关资源
        最近更新 更多