【问题标题】:Not a GROUP BY expression error [duplicate]不是 GROUP BY 表达式错误[重复]
【发布时间】:2012-12-07 10:02:25
【问题描述】:

我对数据库比较陌生。我正在使用 Oracle,并且正在尝试执行此查询以查找该成员参加过的个人培训课程的数量。

表格是;

会员

MEMBERS_ID(NUMBER),
MEMBERSHIP_TYPE_CODE(VARCHAR),
ADDRESS_ID(NUMBER), CLUB_ID(NUMBER) 
MEMBER_NAME(VARCHAR), 
MEMBER_PHONE(VARCHAR), 
MEMBER_EMAIL(VARCHAR)

PERSONAL_TRAINING_SESSIONS

SESSION_ID(VARHCAR), 
MEMBER_ID (NUMBER), 
STAFF_ID(VARCHAR), 
SESSION_DATETIME(DATE)

我的查询返回此错误:

ORA-00979: 不是 GROUP BY 表达式 00979. 00000 - “不是 GROUP BY 表达式” *原因:
*操作:行错误:1 列:8

SELECT MEMBERS.MEMBER_ID,MEMBERS.MEMBER_NAME, COUNT(personal_training_sessions.session_id)
FROM MEMBERS JOIN personal_training_sessions
ON personal_training_sessions.member_id=members.member_id
GROUP BY personal_training_sessions.session_id;

谁能指出我正确的方向?环顾四周,是否需要单独计数查询?

【问题讨论】:

  • 我强烈建议您阅读教程并与一些选择一起玩,看看有什么可能。

标签: sql oracle group-by


【解决方案1】:

错误说明了一切,您没有按MEMBERS.MEMBER_IDMEMBERS.MEMBER_NAME 分组。

SELECT MEMBERS.MEMBER_ID, MEMBERS.MEMBER_NAME
     , COUNT(personal_training_sessions.session_id)
  FROM MEMBERS 
  JOIN personal_training_sessions
    ON personal_training_sessions.member_id = members.member_id
 GROUP BY MEMBERS.MEMBER_ID, MEMBERS.MEMBER_NAME

您想要每个成员的个人会话计数,因此您需要按成员信息进行分组。

基本的(当然它可以变得更复杂)GROUP BY, SELECT 查询是:

SELECT <column 1>, <column n>
     , <aggregate function 1>, <aggregate function n>
  FROM <table_name>
 GROUP BY <column 1>, <column n>

正如 Ken White 所说,聚合函数是 MIN()MAX()COUNT() 等。您可以按所有未聚合的列进行分组。

只有当您的 MEMBERS 表在 MEMBER_ID 上是唯一的时,这才会按预期工作,但根据您的查询,我怀疑它是。为了澄清我的意思,如果您的表在MEMBER_ID 上不是唯一的,那么您不会计算每个MEMBER_ID 的会话数,而是每个MEMBER_ID 的会话数每个@987654333 @。如果他们处于 1:1 的关系,那么实际上是同一件事,但如果每个 MEMBER_ID 可以有多个 MEMBER_NAMEs,那就不是了。

【讨论】:

  • +1。澄清一下,GROUP BY 应该包含所有未聚合的列(不是 SUM()AVG()MIN()MAX() 或其他聚合函数的一部分)。
  • 我刚刚添加了一个类似@KenWhite 的小东西 :-)。
  • 我看到了,但我不确定它是否清楚地解释了;刚接触 SQL 的人可能不知道 &lt;column 1&gt;, &lt;column n&gt; 的意思是 all the columns that are not aggregated
  • 另一个提示:如果您发现在这样的查询中的 GROUP by 子句中有很多元素(例如,您包含的 MEMBERS 表中有很多列),那么您可以将personal_training_session 数据的聚合放在内联视图或公用表表达式中,按member_id 分组,然后将此预聚合结果加入到成员表中。对于大型数据集,这可能会更快,特别是如果您的实例针对 PGA 内存分配较低的 OLTP 查询进行了调整,因为它可以避免排序溢出到磁盘。
  • 感谢您让我微笑@DavidAldridge,这就是我如此喜欢的原因!
【解决方案2】:
SELECT MEMBERS.MEMBER_ID,
       MEMBERS.MEMBER_NAME, 
       COUNT(personal_training_sessions.session_id)

FROM MEMBERS JOIN personal_training_sessions
ON personal_training_sessions.member_id=members.member_id

GROUP BY personal_training_sessions.session_id;

您正在使用 COUNT 函数,因此其他列 MEMBER_ID 和 MEMBER_NAME 必须包含在 group by 子句中。

【讨论】:

    猜你喜欢
    • 2014-12-28
    • 2012-10-03
    • 2013-03-19
    • 2013-03-29
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多