5

我对数据库比较陌生。我正在使用 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;

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

4

2 回答 2

6

该错误说明了一切,您没有按MEMBERS.MEMBER_IDand分组MEMBERS.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()。您 GROUP BY所有未聚合的列。

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

于 2012-12-19T23:10:46.940 回答
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 子句中。

于 2012-12-19T23:10:52.573 回答