2012-12-03 9 views
5

Ho svolto un'attività che comporta la creazione di un database per un ospedale e ho riscontrato un errore molto frustrante che non riesco a risolvere a prescindere da quanta ricerca fare.SQL GROUP BY - Utilizzo della funzione COUNT()

L'errore che ho ricevuto è:

ERRORE alla linea 1: ORA-00979: senza GROUP BY espressione

La struttura del mio codice per l'inserimento dei 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 dei miei tavoli 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) 
); 

Apprezzerei davvero ogni aiuto che qualcuno potrebbe darmi per risolvere questo dilemma.

risposta

8

Poiché si utilizza una funzione di aggregazione, i vostri campi nell'elenco SELECT che non vengono aggregate necessità di essere nel 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 l'uso ANSI JOIN sintassi invece della virgola elenco di tavoli separati:

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 i campi aggiuntivi per la GROUP BY questo potrebbe regolare il totale COUNT() a numeri che non si aspettava. Così potrebbe essere necessario inserire un sotto-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 

Ciò consente di allora GROUP BY quello campo che inizialmente voleva.

+1

Sì, ha funzionato alla grande! Molte grazie :) –