Since you are using an aggregate function, your fields in the SELECT
list that are not being aggregated need to be in the 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
As a side note, I would also use ANSI JOIN syntax instead of the comma separated list of tables:
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
Now, since you need to add the additional fields to the GROUP BY
this could adjust the COUNT()
total to numbers that you are not expecting. So you might need to incorporate a sub-query to get the total count, similar to this:
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
This allows you to then GROUP BY
the one field that you initially wanted.