SQL GRUPPO – Utilizzando funzione COUNT()

Ho fatto un compito che comporta la creazione di un database per un ospedale e ho verificato un errore frustrante che mi sembra di non riuscire a risolvere non importa come molte ricerche che faccio.

L’errore che ho ricevuto è:

ERRORE alla riga 1: ORA-00979: non un GRUPPO, espressione

La struttura del mio codice per l’inserimento di valori è:

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;

E la struttura delle mie tabelle sono:

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

Sarebbe davvero apprezzare qualsiasi aiuto a chiunque possa darmi su come risolvere questo dilemma.

OriginaleL’autore Barry McAuley | 2012-12-03

One Reply
  1. 9

    Poiché si utilizza una funzione di aggregazione, i campi nel SELECT elenco che non vengono aggregati devono essere in 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

    Come nota a margine, vorrei anche utilizzare ANSI JOIN sintassi invece di un elenco separato da virgole di tabelle:

    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

    Ora, dal momento che è necessario aggiungere ulteriori campi per il GROUP BY questo potrebbe regolare la COUNT() totale di numeri che non si aspettano. Quindi potrebbe essere necessario incorporare un sub-query per ottenere il conteggio totale, simile a questo:

    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

    Questo permette quindi di GROUP BY un campo che si voleva.

    Sì, che ha funzionato alla grande! Grazie mille 🙂

    OriginaleL’autore Taryn

Lascia un commento