【问题标题】:SQL GROUP BY - Using COUNT() functionSQL GROUP BY - 使用 COUNT() 函数
【发布时间】:2012-11-20 22:38:09
【问题描述】:

我一直在执行一项涉及为医院创建数据库的任务,但我遇到了一个非常令人沮丧的错误,无论我进行多少研究,我似乎都无法修复。

我收到的错误是:

第 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)
);

非常感谢任何人可以帮助我解决这个难题。

【问题讨论】:

    标签: sql oracle group-by ora-00979


    【解决方案1】:

    由于您使用的是聚合函数,因此您在 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 您最初想要的一个字段。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-18
      • 2012-06-30
      • 2012-07-09
      • 1970-01-01
      • 2021-03-25
      • 1970-01-01
      • 2021-04-01
      相关资源
      最近更新 更多