2012-12-03 61 views
5

Tôi đã thực hiện một nhiệm vụ liên quan đến việc tạo cơ sở dữ liệu cho bệnh viện và tôi đã gặp phải một lỗi rất khó chịu mà tôi không thể sửa được cho dù tôi có nghiên cứu bao nhiêu làm.SQL GROUP BY - Sử dụng hàm COUNT()

Các lỗi tôi nhận được là:

ERROR at line 1: ORA-00.979: không phải là một GROUP BY biểu

Cấu trúc của mã của tôi để chèn các giá trị là:

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; 

Và cấu trúc của các bảng của tôi là:

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

Thực sự đánh giá cao bất kỳ sự giúp đỡ nào mà bất kỳ ai cũng có thể cho tôi giải quyết tình trạng khó xử này.

Trả lời

8

Vì bạn đang sử dụng một chức năng tổng hợp, lĩnh vực của bạn trong danh sách SELECT mà không được tổng hợp cần phải được trong 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 

Như một mặt lưu ý, tôi sẽ cũng sử dụng ANSI JOIN thay vì của dấu phẩy tách ra danh sách các bảng:

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 

Bây giờ, kể từ khi bạn cần phải thêm các trường bổ sung cho các GROUP BY này có thể điều chỉnh tổng COUNT() đến các số mà bạn không mong đợi. Vì vậy, bạn có thể cần phải kết hợp một phụ truy vấn để có được tổng số, tương tự như sau:

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 

này cho phép bạn sau đó GROUP BY một trong những lĩnh vực mà ban đầu bạn muốn.

+1

Vâng, nó hoạt động rất tốt! Cảm ơn rất nhiều :) –