2012-12-03 35 views
5

我一直在做一项涉及为医院创建数据库的任务,而且我一直在遇到一个非常令人沮丧的错误,我似乎无法修复,无论我进行了多少研究做。SQL GROUP BY - 使用COUNT()函数

我收到的错误是:

ERROR位于第1行:ORA-00979:不是GROUP BY表达

我的代码用于插入值的结构是:

SELECT CONSULTANT.S_NO, DOCTOR.D_NAME, CONSULTANT.SPEC, 
PATIENT.P_ID, PATIENT.P_NAME, COUNT(CONSULTANT.P_ID) 
FROM PATIENT, CONSULTANT, DOCTOR        
WHERE PATIENT.P_ID = CONSULTANT.P_ID 
AND  CONSULTANT.S_NO = DOCTOR.S_NO 
GROUP BY CONSULTANT.S_NO; 

而我的桌子的结构是:

CREATE TABLE PATIENT (
    P_ID  NUMBER NOT NULL, 
    P_NAME  CHAR(20), 
    ADDRESS  VARCHAR(20), 
    DOB  DATE, 
    WARD_NO  NUMBER NOT NULL, 
    C_S_NO  NUMBER NOT NULL, 
    CONSTRAINT PK_PATIENT PRIMARY KEY(P_ID) 
); 

CREATE TABLE DOCTOR (
    S_NO  NUMBER NOT NULL, 
    D_NAME  CHAR(20), 
    APP_DATE DATE, 
    CONSTRAINT PK_DOC PRIMARY KEY(S_NO) 
); 

CREATE TABLE CONSULTANT (
    S_NO  NUMBER NOT NULL, 
    P_ID  NUMBER NOT NULL, 
    SPEC  CHAR(20), 
    T_CODE  VARCHAR(20) NOT NULL, 
    CONSTRAINT PK_CDOC PRIMARY KEY(S_NO) 
); 

真的很感谢任何人都可以帮助我解决这个困境。

回答

8

由于您使用的是聚合函数,你在SELECT列表字段并未汇总需要在该GROUP BY

SELECT CONSULTANT.S_NO, DOCTOR.D_NAME, CONSULTANT.SPEC, 
PATIENT.P_ID, PATIENT.P_NAME, COUNT(CONSULTANT.P_ID) 
FROM PATIENT, CONSULTANT, DOCTOR        
WHERE PATIENT.P_ID = CONSULTANT.P_ID 
    AND  CONSULTANT.S_NO = DOCTOR.S_NO 
GROUP BY CONSULTANT.S_NO, DOCTOR.D_NAME, CONSULTANT.SPEC, PATIENT.P_ID, PATIENT.P_NAME 

作为一个方面说明,我也会使用ANSI JOIN语法,而不是的逗号分隔表的列表:

SELECT c.S_NO, d.D_NAME, c.SPEC, p.P_ID, p.P_NAME, COUNT(c.P_ID) 
FROM PATIENT p 
INNER JOIN CONSULTANT c 
    ON p.P_ID = c.P_ID 
INNER JOIN DOCTOR d 
    ON c.S_NO = d.S_NO 
GROUP BY c.S_NO, d.D_NAME, c.SPEC, p.P_ID, p.P_NAME 

现在,因为你需要额外的字段添加到GROUP BY这可能调整COUNT()总为数字,你是不是期待。所以,你可能需要把一个子查询,以获得总计数,与此类似:

SELECT c1.S_NO, d.D_NAME, c1.SPEC, p.P_ID, p.P_NAME, c2.Count_P_ID 
FROM PATIENT p 
INNER JOIN CONSULTANT c1 
    ON p.P_ID = c1.P_ID 
INNER JOIN 
(
    select COUNT(c.P_ID) Count_P_ID, S_NO 
    from CONSULTANT c 
    group by S_NO 
) c2 
    ON c1.S_NO = c2.S_NO 
INNER JOIN DOCTOR d 
    ON c1.S_NO = d.S_NO 

这可以让你再GROUP BY的一个领域,你最初想。

+1

是的,这很好!非常感谢 :) –