2012-12-03 2 views
5

私は病院用のデータベースを作成する作業を行ってきましたが、私はどれほど多くの研究があっても修正できないような非常にイライラしたエラーが発生しました。行う。発現によるものGROUPSQL GROUP BY - COUNT()関数を使用する

値を挿入するための私のコードの構造である:

Iは、受信エラーがある:1行目

ERROR:ORA-00979

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

あなたは、集計関数、GROUP BYにする必要が集約されていないSELECTリストであなたのフィールドを使用しているので:注意点として

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 

、あなたはこれがあなたが期待していない番号にCOUNT()合計を調整することができGROUP BYにフィールドを追加する必要があるため。ですから、これに似た合計数、取得するには、サブクエリを組み込むことが必要になる場合があります。

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

うん、うまくいった!どうもありがとう :) –