我对数据库比较陌生。我正在使用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;
有人能指出我正确的方向吗?我环顾四周,是否需要将计数查询分开?
答案 0 :(得分:6)
错误说明了这一点,您不是按MEMBERS.MEMBER_ID
和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()
之类的东西一样,聚合函数等。你将所有列都归结为聚合
如果您的MEMBERS
表在MEMBER_ID
上是唯一的,但只根据您的查询我怀疑它是唯一的。为了澄清我的意思,如果您的表格在MEMBER_ID
上不是唯一的,那么您不计算每MEMBER_ID
个会话的数量,而是每个MEMBER_ID
的会话数量和< / em> per MEMBER_NAME
。如果他们处于1:1的关系中,那么它实际上是相同的,但是如果每个MEMBER_NAME
可以有多个MEMBER_ID
s,那么它就不是。{/ p>
答案 1 :(得分: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&amp; MEMBER_NAME必须包含在group by子句中。